2009-03-31 11 views
8
public sealed class FtpManager 
{ 
    public event EventHandler LoggingIn = delegate { }; 
    private void OnLoggingIn(object sender, EventArgs e) 
    { 
     var handler = LoggingIn; 
     handler(sender, e); 
    } 
// ... 
} 

上記のコードでは、LoggingInイベントハンドラを空のデリゲートで初期化しました。

これは、何らかの形で使用されるメモリスペースに影響しますか?特に何百、何千というイベントがこのように宣言されているとしたら?空のデリゲートがメモリを使い果たしますか?

+0

関連する追加のメソッド呼び出しを忘れないでください。イベントハンドラと匿名デリゲートを使用して割り当てた空のメソッドの両方を呼び出します。私はテストを実行していないが、少なくともそれを認識している必要があります... –

答えて

13

前回の回答をスクラッチします(後に続く)。これはコンパイラの実装に依存しますが、現在のMS C#3.0コンパイラでは、実際にはすべてのインスタンスで再利用される単一のインスタンスしか作成されません。デリゲートは不変であり、デリゲートはインスタンスからの情報を必要としないため、これを行うことができます。

これがC#2.0のケースであるかどうかはわかりませんが、コードを逆コンパイルして、ILが実際にキャッシュされたフィールドを使用するかどうかを確認できます。以下の答えを使用すると安全な方法です保証あなたは1つのインスタンスを作成します。

オリジナルの答え:

はい、それは、デリゲートのインスタンスを作成します。それはいくらかの記憶を取るでしょう。あなたはそれを減らすことができます:

その時点で1つのインスタンスがあり、あなたはどこからでもそれを参照することができます。欠点は、他のクラスが同じハンドラを使用して登録を解除できることです。コードベースの残りの部分がそれをしないと信じているなら、これはメモリの観点からはおそらく最善の策でしょう。

+0

私は空の状態でイベントを宣言しているため、デリゲート...;もう一度ありがとう、Jon – Sung

+0

@宋:私は私の答えを完全に変えました。しかし、元のバージョンに戻って編集することもできます! –

+0

@Sung:これで、はるかに完了しました。あなたはあなたのアプリを逆コンパイルすることでこれがあなたの問題であるかどうかを確認することができます。リフレクターはこれにはいいですが、本当に何が起きているのかを確認するにはILを見る必要があります。 –

-1

これを行う代わりに、LoggingInを呼び出すたびに無効化をチェックすることができます。それは、空の代理人を呼び出すよりもメモリに集中する傾向があります。

+0

これをサポートするテストを実行しましたか、それとも単なる前提ですか? –

+0

いいえ、私は制限要因を指摘しました。テストをしたい場合は、他の誰かと同じように簡単に記述することができます。 –

関連する問題