以下代码是否使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();
}
}
输出:超级一次性
我对using(...)
功能的理解是立即强制处置DisposableClass
. 然而在代码块中,我们将类添加到字典集合中。我的理解是,一个类本质上是一个引用类型。所以我的实验是看看以这种方式添加到集合中的一次性对象会发生什么。
在这种情况下DisposableClass
仍然是相当活跃的。类是一种引用类型 - 所以我的假设变成了集合不仅仅是引用这种类型,而是确实将类作为一个值。但是,这也没有任何意义。
那么到底发生了什么?
编辑:修改后的代码,输出证明对象没有死,正如一些答案所暗示的那样。
第二次编辑:当我经历了更多代码时,这归结为:
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)
),将 wherefalse
传递给方法,因此必须在此处正确处理资源。无论如何,这门课还活着,但你肯定是在为例外做好准备。答案让我更加好奇...