前回の続きです。
delegateができること
delegateキーワードで定義した型はSystem.Delegateクラスの派生クラスになる。
よって、System.Delegateクラスが持つプロパティやメソッドを持ち、
共通言語ランタイムによってBeginInvokeメソッドとEndInvokeメソッドが提供されるようです。
具体的には次のようなことが可能になる。
メソッドを呼び出せる
delegateで定義された型はメソッドを表すので、そこに代入されたメソッドを参照し利用できる。
例えば、次のようなコードを実行すると
public class DelegateSample01 { //SampleDelegate型の定義 delegate void SampleDelegate(string str); //SampleDelegate型のsample変数の宣言 static SampleDelegate sample; public static void Main(){ var text = "出力して欲しい物"; //SampleDelegate型のsample変数にstatic void Write(string)メソッドの代入 sample = Write; //sample変数に代入されたメソッドを参照呼出し sample(text); } public static void Write(string text){ System.Console.WriteLine(text); } }
出力:
出力して欲しい物
となる。
このコード自体に意味はない。重要なのは12行目にある、
sample(text);
である。上記のように記述することで、10行目にsample変数に代入したstatic void Write(string)メソッドを呼び出すことが出来る。
メソッドを引数にできる
メソッドとしての型を定義しているので、その型の変数を引数として利用できる。
例えば次のクラスを定義し、
//SampleDelegate型の定義 public delegate void SampleDelegate(string str); public class SampleClass{ public void SampleMethod(SampleDelegate sample){ var text = "出力して欲しい物"; //引数のsample変数によって引き渡されたメソッドを参照呼出し sample(text); } }
次のように実行すると
public class DelegateSample02 { public static void Main(){ //クラスのインスタンス生成 var sampleClass = new SampleClass(); //static Write(string)メソッドを引数としてメソッド呼び出し sampleClass.SampleMethod(Write); } public static void Write(string text){ System.Console.WriteLine(text); } }
出力:
出力して欲しい物
となる。SampleClass.csの5行目にあるSampleClass.SampleMethod(SampleDelegate)メソッドの引数として、メソッドの参照を渡すことができる。
このコード自体にも意味はないが、意識する点はSampleClass.csの2行目にあるデリゲートの定義のスコープが他のクラスで利用するのでpublicとなっている点である。