10

簡単な質問があります。関数参照を渡すだけではなく、C#デリゲートをインスタンス化する利点は何ですか?私が意味するのは:

なぜか:

Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod));

あなたができるとき:

Thread t = new Thread(SomeObject.SomeMethod);

どちらも私の経験でコンパイルして動作します...私は何かが足りないのですか?

4

3 に答える 3

6

メソッド グループSomeObject.SomeMethodに戻り値の型voidがあり、パラメーターを取らないメソッドがある限り、違いはありません。これは、がを返し、パラメーターをとらないThreadStartとして定義されているためです。そのため、メソッド グループから への暗黙的な変換が行われます。したがって、どちらもコンストラクターのオーバーロードを呼び出しています。delegatevoidSomeObject.SomeMethodThreadStartThread(ThreadStart)Thread

言語仕様の関連セクションは §6.6 (メソッド グループの変換) です。

簡単な質問があります。関数参照を渡すだけではなく、C# デリゲートをインスタンス化する利点は何ですか?

というわけで、ここで用語の修正のみ。と

class MyObject {
    public void SomeMethod() { }
}

MyObject someObject = new MyObject();

で示されるものsomeObject.SomeMethodはメソッド群です。オーバーロードされたメソッドのセットは、表記法を使用して検索できると考えることができますsomeObject.SomeMethod

于 2010-02-02T01:17:10.447 に答える
4

コンパイラは、短いコードを入力したときに長いコードを意味していると推測します。究極の効果に違いはありません。完全なコンストラクターの明確さが必要な場合は、それを入れることができます。メソッド グループだけを簡潔にしたい場合は、コンパイラにコンストラクタを推論させることができます。それは単なるスタイル上の選択です。

于 2010-02-02T07:00:20.803 に答える
0

それは同等です。このテーマに関する優れた入門記事: C# Delegates, Anonymous Methods, and Lambda Expressions – O My!

于 2010-02-02T01:17:19.353 に答える