以下代碼是否使using(...)
功能/用途無關?
是否會導致GC性能不足?使用`使用(...)`有效無效和/或效率低下?
class Program
{
static Dictionary<string , DisposableClass> Disposables
{
get
{
if (disposables == null)
disposables = new Dictionary<string , DisposableClass>();
return disposables;
}
}
static Dictionary<string , DisposableClass> disposables;
static void Main(string[] args)
{
DisposableClass disposable;
using (disposable = new DisposableClass())
{
// do some work
disposable.Name = "SuperDisposable";
Disposables["uniqueID" + Disposables.Count] = disposable;
}
Console.WriteLine("Output: " + Disposables["uniqueID0"].Name);
Console.ReadLine();
}
}
class DisposableClass : IDisposable
{
internal string Name
{
get { return myName; }
set { myName = value; }
}
private string myName;
public void Dispose()
{
//throw new NotImplementedException();
}
}
輸出:SuperDisposable
我的using(...)
功能的理解是立即強制處置DisposableClass
的。然而,在代碼塊中,我們將該類添加到字典集合中。我的理解是,一個類本質上是一個參考類型。所以我的實驗是看看以這種方式添加到集合中的一次性對象會發生什麼。
在這種情況下DisposableClass
仍然很活躍。類是一個引用類型 - 所以我的假設變成了這個集合不是簡單地引用這個類型,而是確實把類作爲一個值。但是,這也沒有意義。
那麼究竟發生了什麼?
編輯:修改後的代碼與輸出,以證明對象沒有死,可能會提出一些答案。
2日編輯:這是什麼歸結爲我通過一些更多的代碼去是這樣的:
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool dispose)
{
if (!isDisposed)
{
if (dispose)
{
// clean up managed objects
}
// clean up unmanaged objects
isDisposed = true;
}
}
~DisposableClass()
{ Dispose(false); }
逐步執行代碼(曾在private void Dispose(bool dispose)
斷點),其中false
傳遞給方法,資源在這裏得到妥善處理變得勢在必行。無論如何,這個班還活着,但你絕對是爲了例外而設。答案讓我更加好奇......
不夠公平。我試圖理解發生的事情。如果該對象被假定被丟棄,或與該對象相關的資源。 +1 – IAbstract 2010-02-13 23:27:55