「デリゲート」という言葉は少し乱用されています。クラスとオブジェクトを使用すると簡単です。「クラス」はオブジェクトの設計図のようなものです。「オブジェクト」はメモリ内の実際のインスタンスであり、クラスの設計図に従います。
デリゲートについても同じ言葉を使用しているため、混乱していると思います。次のコードを検討してください。
class Main
{
public delegate int DelegateType(string x);
public int SomeFunction(string y) { return int.Parse(y)*2; }
public void Main()
{
DelegateType delegateInstance = null;
delegateInstance = SomeFunction;
int z = delegateInstance("21");
Console.WriteLine(z);
}
}
このコードは「42」を出力します。
DelegateType
デリゲートの型です。クラスがオブジェクトの設計図であるように、デリゲートは関数の設計図です。
そのため、後でdelegateInstance
、タイプの変数という名前を作成しますDelegateType
。その変数には、単一の文字列パラメーターを取り、整数を返すANY関数を割り当てることができます。関数の結果ではなく、関数自体を割り当てたことに注意してください。delegateInstance
変数がその関数のシノニムになったようです。実際、後で行を示したdelegateInstance
ように、関数を呼び出すために使用できるようになりました! あたかもdelegateInstance
関数そのものであるかのように。しかし、それは変数であるため、通常変数で行うのと同じことをすべて行うこともできます-変数をパラメーターとして他の関数に渡したり、他の関数から返すことさえできます(関数を返す関数! !)
では、あなたを困惑させたコードを見てみましょう。
public static void Save()
{
ThreadStart threadStart = delegate
{
SaveToDatabase();
};
new Thread(threadStart).Start();
}
private static void SaveToDatabase() { }
最初に気付くのは、anonymous delegate
. 用語の別の誤用。コンパイルすると、次のようになります。
public static void Save()
{
ThreadStart threadStart;
threadStart = __ASDASDASD6546549871;
var tmp = new Thread(threadStart);
tmp.Start();
}
private static void SaveToDatabase() { }
private void __ASDASDASD6546549871()
{
SaveToDatabase();
}
匿名関数は、実際にはランダムな名前を持つ完全に通常の関数に変換され、その関数がthreadStart
変数に割り当てられていることに注意してください。
したがって、これは上記の例とまったく同じです。DelegateType
、ThreadStart
、delegateInstance
に置き換えるだけthreadStart
ですSomeFunction
。__ASDASDASD6546549871
それは今意味がありますか?