以下代码是否使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