以前曾看見過這樣一個問題
今天看到一個非常有趣的例子
以前對於釋放Handler的觀念是一點也沒有
事情是這樣的
發現其是一種通過弱引用實現的Delegate
文章裡提出了一個問題
UnRelease Event Handler
using System
using System
using System
using Microsoft
namespace ConsoleApplication
{
class DisplaySettingsListener
{
byte[] m_ExtraMemory = new byte[
public DisplaySettingsListener()
{
SystemEvents
}
private void ehDisplaySettingsChanged(object sender
{
}
}
class Program
{
static void DisplayMemory()
{
Console
}
static void Main()
{
DisplayMemory()
Console
for (int i =
{
Console
DisplaySettingsListener listener = new DisplaySettingsListener()
listener = null
GC
DisplayMemory()
}
Console
}
}
}
運行的結果如下
雖然我們釋放了對listener的引用
這就是該文作者指出的事件列表裡保存的是一個強命名的引用而非弱引用
那麼接下來看看下面的代碼
Release Event Hanlder
class DisplaySettingsListener
{
byte[] m_ExtraMemory = new byte[
public DisplaySettingsListener()
{
SystemEvents
}
private void ehDisplaySettingsChanged(object sender
{
}
IDisposable Members#region IDisposable Members
public void Dispose()
{
SystemEvents
}
#endregion
}
class Program
{
static void DisplayMemory()
{
Console
}
static void Main()
{
DisplayMemory()
Console
for (int i =
{
Console
DisplaySettingsListener listener = new DisplaySettingsListener()
listener
listener = null
GC
DisplayMemory()
}
Console
}
}
運行結果如下
結果是不是正如您猜測的呢
詳情可以看原文 The Problem With Delegates
在後續的文章中作者類似文章開頭提到的Weak Event來解決這個問題
也許您覺得寫這樣的一個Weak Event沒有必要或者顯得麻煩
From:http://tw.wingwit.com/Article/program/net/201311/11737.html