講義メモ

・p.201「引数が可変個のメソッド」から

提出フォロー:p.199 main02.cs

//p.199 main02.cs
using System;
class main02 {
    public static int Main(string[] args) { //コマンドライン引数を受け取り整数を返す 
        if (args.Length != 1) { //引数が1個でなければ
            return -1; //終了コード-1を返す(異常終了)
        } else {
            if (!Char.IsDigit(args[0][0])) { //引数の0個目の0文字目が数字でなければ
                return -2;  //終了コード-12を返す(異常終了)
            }
        }
        return int.Parse(args[0]); //引数の0個目を整数化して終了コードとして返す
    }
}

p.201 引数が可変個のメソッド

・paramsキーワードと配列を引数として渡すことで、引数が可変個のメソッドが実現できる
・定義書式: アクセス修飾子 戻り値型 メソッド(params 引数型[] 引数名){…}
・引数の数に制限はないが、全てが同じ型、または、引数型のクラスの派生クラス型であること
・例: public int addall(params int[] n){…}
・ここの引数は引数名[添字]で利用可能で、指定された引数の数は、Lengthプロパティで得られる。

p.201 params01.cs

//p.201 params01.cs
using System;
class MyClass {
    public void show(params string[] animal) { //引数が可変個のメソッド
        if (animal.Length == 0) { //引数が全く指定されていなければ
            return; //何せずに戻る
        }
        for (int i = 0; i < animal.Length; i++) { //引数の数だけ繰返す
            Console.WriteLine("{0}さんがいます", animal[i]);
        }
    }
}
class params01 {
    public static void Main() {
        MyClass mc = new MyClass();
        mc.show(); //引数が全く指定せずに呼ぶ
        mc.show("きりん", "ぞう", "かば"); //引数を3つ指定して呼ぶ
    }
}

アレンジ演習:p.201 params01.cs

・for文は前判定繰り返しなので「引数が全く指定されていなければ」の判断は不要
・また、引数の数だけ繰返すにはforeachを用いると、Lengthプロパティを用いる必要はない
・以上を試そう

作成例

//アレンジ演習:p.201 params01.cs
using System;
class MyClass {
    public void show(params string[] animal) { //引数が可変個のメソッド
        foreach (var w in animal) { //全引数の分、繰返す
            Console.WriteLine("{0}さんがいます", w);
        }
    }
}
class params01 {
    public static void Main() {
        MyClass mc = new MyClass();
        mc.show(); //引数を全く指定せずに呼ぶ
        mc.show("きりん", "ぞう", "かば"); //引数を3つ指定して呼ぶ
    }
}

補足:引数が可変個のメソッド

・paramsの前に、通常の引数を定義できる。型が異なってもかまわない。
 例: public void show(int i, params string[] animal) {…}
・paramsの前に、通常の引数を複数定義できる。型が異なってもかまわない。
 例: public void show(int i, double d, params string[] animal) {…}
・通常の引数は省略できないので注意
 例: public void show(int i, params string[] animal) {…} の場合、呼び出しは
 「show(整数)」または「show(整数, 文字列,…,文字列)」である必要がある
・paramsは末尾の引数である必要があり、1つしか定義できない
・引数が可変個のメソッドもオーバーロード可能だが、確実に呼び分けができることが必要
・よって、引数がparamsのみのメソッドを複数記述すると、引数なしでの呼び出しはエラーになる
 例: public void show(params string[] animal) {…} と、
    public void show(params double[] animal) {…} がある場合、show()とするとエラー
・また、paramsの前に、paramsと同じ型の通常の引数を持つメソッドを記述すると、エラーにはならないが、paramsのみを持つメソッドは、
 引数なしの場合だけ呼び出される
 例: public void show(params string[] animal) {①} と、
    public void show(string s, params string[] animal) {②} がある場合、エラーにはならないが、
    show(文字列,…)とすると常に②が呼ばれ、show()とした場合にのみ①が呼ばれる

p.202 静的メンバ

・通常のインスタンス変数、メソッドなどのメンバは、クラスから生成したオブジェクトに含まれる
・よって、オブジェクトを指す参照変数を用いて「参照変数名.メンバ名」で用いる
・しかし、ConsoleクラスのWriteメソッドのように「Console.Write」と「クラス名.メンバ名」で利用できるものもあり、
 これはメンバがクラスに含まれている(特殊型)
・この、クラスに含まれているメンバを静的メンバといい、オブジェクトに含まれる必要が無い特別な場合に利用できるが、
 利用には制限がある
・静的データメンバの定義書式: アクセス修飾子 static 型 変数名;
・静的メソッドの定義書式: アクセス修飾子 static 戻り値型 メソッド名(){…};

p.203 static01.cs

//p.203 static01.cs
using System;
class MyClass {
    public static int x; //静的データメンバ
    public static void showX() { //静的メソッド
        Console.WriteLine("x = {0}", x);
    }
}
class static01 {
    public static void Main() {
        MyClass.x = 10; //インスタンスを生成せずに「クラス名.メンバ名」で利用可
        MyClass.showX(); //インスタンスを生成せずに「クラス名.メソッド名()」で利用可
    }
}

p.204 静的クラス

・全てのメンバが静的であるクラスは、静的クラスとしておくことで、将来、誤って静的ではないメンバが書き加えられたり、
 静的メンバがインスタンスメンバに書き換えられたりすることを防止できる。

p.204 static02.cs

//p.204 static02.cs
using System;
static class MyClass { //静的クラス
    public static int x; //静的データメンバ
    public static void showX() { //静的メソッド
        Console.WriteLine("x = {0}", x);
    }
}
class static01 {
    public static void Main() {
        MyClass.x = 10; //インスタンスを生成せずに「クラス名.メンバ名」で利用可
        MyClass.showX(); //インスタンスを生成せずに「クラス名.メソッド名()」で利用可
        Console.WriteLine(MyClass.X);
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です