この章のテーマ §
メソッド呼び出しのバリエーションについて学びます。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, string型, メソッドの基礎, デリゲート型
解説 §
メソッドを呼び出す方法は、大きく分けて2つあります。
一つはそのメソッドの名前そのものを書いて、"メソッド名(引数リスト)"のような書式で呼び出す方法です。
もう一つは、メソッドへの参照をデリゲート型の値として取得し、それを"式(引数リスト)"のような書式で経由して呼び出す方法です。
つまり、括弧の手前に書かれた名前はいつもメソッド名とは限りません。
また、式の値を経由して呼び出す場合は、サンプルソースの"myArray[123 + 456 - 579]("配列経由で呼ぶぞ");"のように、メソッド呼び出しに見えない書式になることもありますが、それでもメソッドは呼び出されています。
罠の数々 §
- デリゲート型の値を経由して呼び出す場合、呼び出すものはラムダ式などでも良い
- メソッドの呼び出しは、スコープで制約されるが、参照を変数に入れて持ち出せばスコープ外からも呼び出せる
参考リンク §
メソッド (C# プログラミング ガイド)
デリゲートの使用 (C# プログラミング ガイド)
サンプルソース: callingMethods §
myMethod("普通に呼ぶぞ");
Action<string> myVar = myMethod;
myVar("変数経由で呼ぶぞ");
var myArray = new Action<string>[] { myMethod };
myArray[123 + 456 - 579]("配列経由で呼ぶぞ");
void myMethod(string message)
{
Console.WriteLine($"myMethod called: {message}");
}
実行結果 §
myMethod called: 普通に呼ぶぞ
myMethod called: 変数経由で呼ぶぞ
myMethod called: 配列経由で呼ぶぞ
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
プログラムの実行中にデリゲート型の変数の値を書き換えた。
以下のプログラムの実行結果を予測してみよう。
Action a = sub1;
a();
a = sub2;
a();
void sub1() => Console.Write("sub1 ");
void sub2() => Console.Write("sub2 ");
- sub1 sub1
- sub1 sub2
- sub2 sub2
- 実行時の例外
- コンパイルエラー
[[解答]]