Dot-Net
一個空的代表會吃掉記憶體嗎?
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; }那時只有一個實例,您可以從任何地方引用它。缺點是其他類可以使用相同的處理程序取消訂閱。如果您相信程式碼庫的其餘部分不會這樣做,那麼從記憶體的角度來看,這可能是最好的選擇。