9


0

空の代理人はメモリを使い果たしますか?
public sealed class FtpManager
{
    public event EventHandler LoggingIn = delegate { };
    private void OnLoggingIn(object sender, EventArgs e)
    {
        var handler = LoggingIn;
        handler(sender, e);
    }
// ...
}

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

それはどのような方法で使用されるメモリスペースに影響しますか? 特にそのように宣言された何百、何千ものイベントがあるときはどうでしょうか。

2 Answer


14


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

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

元の答え:

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

パブリック静的クラスEventHandlers {パブリック静的読み取り専用EventHandler Empty = delegate {}; }

パブリックシールクラスFtpManager {パブリックイベントEventHandler LoggingIn = EventHandlers.Empty; }

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


-1


これを行う代わりに、あなたがそれを上げたいときはいつもLoggingInをnullかどうかチェックすることです。 空のデリゲートを呼び出すよりも、メモリを多く消費する可能性があります。