簡単な質問があります。関数参照を渡すだけではなく、C#デリゲートをインスタンス化する利点は何ですか?私が意味するのは:
なぜか:
Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod));
あなたができるとき:
Thread t = new Thread(SomeObject.SomeMethod);
どちらも私の経験でコンパイルして動作します...私は何かが足りないのですか?
簡単な質問があります。関数参照を渡すだけではなく、C#デリゲートをインスタンス化する利点は何ですか?私が意味するのは:
なぜか:
Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod));
あなたができるとき:
Thread t = new Thread(SomeObject.SomeMethod);
どちらも私の経験でコンパイルして動作します...私は何かが足りないのですか?
メソッド グループSomeObject.SomeMethod
に戻り値の型void
があり、パラメーターを取らないメソッドがある限り、違いはありません。これは、がを返し、パラメーターをとらないThreadStart
として定義されているためです。そのため、メソッド グループから への暗黙的な変換が行われます。したがって、どちらもコンストラクターのオーバーロードを呼び出しています。delegate
void
SomeObject.SomeMethod
ThreadStart
Thread(ThreadStart)
Thread
言語仕様の関連セクションは §6.6 (メソッド グループの変換) です。
簡単な質問があります。関数参照を渡すだけではなく、C# デリゲートをインスタンス化する利点は何ですか?
というわけで、ここで用語の修正のみ。と
class MyObject {
public void SomeMethod() { }
}
MyObject someObject = new MyObject();
で示されるものsomeObject.SomeMethod
はメソッド群です。オーバーロードされたメソッドのセットは、表記法を使用して検索できると考えることができますsomeObject.SomeMethod
。
コンパイラは、短いコードを入力したときに長いコードを意味していると推測します。究極の効果に違いはありません。完全なコンストラクターの明確さが必要な場合は、それを入れることができます。メソッド グループだけを簡潔にしたい場合は、コンパイラにコンストラクタを推論させることができます。それは単なるスタイル上の選択です。
それは同等です。このテーマに関する優れた入門記事: C# Delegates, Anonymous Methods, and Lambda Expressions – O My!