Dot-Net

一個空的代表會吃掉記憶體嗎?

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

在上面的程式碼中,我LoggingIn使用空委託初始化了事件處理程序。

這會影響以任何方式使用的記憶體空間嗎?尤其是當有成百上千的事件以這種方式聲明時?

劃掉以前的答案(保留在下面以供後代使用)。這取決於編譯器的實現,但在目前的 MS C# 3.0 編譯器下,這實際上只創建了一個實例,每個實例都可以重用該實例。它能夠做到這一點是因為委託是不可變的,並且該委託不需要來自實例的任何資訊。

我不知道 C# 2.0 是否就是這種情況。您可以反編譯您的程式碼並查看 IL 是否實際使用記憶體欄位。使用下面的答案是一種安全的方法,可以保證您只創建一個實例。

原答案:

是的,它創建了一個委託的實例。這將需要一些記憶。你可以減少它:

public static class EventHandlers
{
   public static readonly EventHandler Empty = delegate {};
}

public sealed class FtpManager
{
   public event EventHandler LoggingIn = EventHandlers.Empty;
}

那時只有一個實例,您可以從任何地方引用它。缺點是其他類可以使用相同的處理程序取消訂閱。如果您相信程式碼庫的其餘部分不會這樣做,那麼從記憶體的角度來看,這可能是最好的選擇。

引用自:https://stackoverflow.com/questions/703014