「新規」がある場合とない場合の配線イベントの違い
質問
C# では、これら 2 行のコードに違いがある場合、どのような違いがありますか?
tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);
そして
tmrMain.Elapsed += tmrMain_Tick;
どちらもまったく同じように動作するように見えます。C# では、後者を入力したときに、前者を意味するとみなしているだけでしょうか?
解決
これは私がしました
static void Hook1()
{
someEvent += new EventHandler( Program_someEvent );
}
static void Hook2()
{
someEvent += Program_someEvent;
}
次に、コードに対して ildasm を実行しました。
生成された MSIL はまったく同じでした。
あなたの質問に答えると、はい、それらは同じものです。
コンパイラは、あなたが望んでいることを推測しているだけです someEvent += new EventHandler( Program_someEvent );
-- 新しいものを作成しているのがわかります。 EventHandler
どちらの場合も MSIL のオブジェクト
他のヒント
以前 (.NET 1.x の時代)、それを行う唯一の方法は長い形式でした。どちらの場合も、Program_someEvent メソッドを指すようにデリゲートを新しく作成します。
違いはないと思います。確かに、resharper は、最初の行に冗長なコードがあると言っています。
少し話が逸れました:
デリゲートをインスタンス化できます (new EventHandler(MethodName))
そして (適切な場合) そのインスタンスを再利用します。
そうではありませんでした new XYZEventHandler
C#2003 までは必須でしたが、C#2005 では冗長コードを省略できましたか?
実際に判断する 1 つの方法は、コードに対して生成された MSIL を確認することだと思います。良好な酸テストになる傾向があります。
それが何らかの形で GC を混乱させるのではないかという奇妙な懸念があります。この方法で行う必要がない場合に、新しいデリゲート型を宣言するためのオーバーヘッドがすべて発生するのは奇妙に思えます。