14

C# では、これら 2 行のコードの違い (ある場合) は何ですか?

tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);

tmrMain.Elapsed += tmrMain_Tick;

どちらもまったく同じように見えます。C# は、後者を入力するときに前者を意味すると想定しているだけですか?

4

6 に答える 6

26

これは私がしました

static void Hook1()
{
    someEvent += new EventHandler( Program_someEvent );
}

static void Hook2()
{
    someEvent += Program_someEvent;
}

そして、コードに対して ildasm を実行しました。
生成された MSIL はまったく同じでした。

あなたの質問に答えるために、はい、それらは同じものです。
コンパイラは、必要なことを推測しているだけです。MSIL の両方のケースで、新しいオブジェクトをsomeEvent += new EventHandler( Program_someEvent );
作成していることがわかります。EventHandler

于 2008-08-25T21:02:27.847 に答える
4

以前は (.NET 1.x 日)、長い形式が唯一の方法でした。どちらの場合も、Program_someEvent メソッドを指すようにデリゲートを作成しています。

于 2008-08-25T21:15:55.363 に答える
2

違いはないと思います。確かに resharper は、最初の行に冗長なコードがあると言います。

于 2008-08-25T21:05:48.790 に答える
2

少しオフトピック :

デリゲート(new EventHandler(MethodName))をインスタンス化し、(適切な場合) そのインスタンスを再利用できます。

于 2008-08-25T22:31:30.470 に答える
0

new XYZEventHandlerC#2003 までは require だったのに、C#2005 では冗長なコードを省略できたのですか?

于 2008-08-25T21:13:04.090 に答える
-1

本当にわかる1つの方法は、コード用に作成されたMSILを見ることだと思います..良い酸テストになる傾向があります..

どういうわけかGCを台無しにするかもしれないという面白い懸念があります..新しいデリゲート型を宣言する必要がない場合、この方法で宣言するすべてのオーバーヘッドがあるのは奇妙に思えますね。

于 2008-08-25T21:06:26.183 に答える