次のコードは、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
すると、ここでリソースを適切に破棄することが不可欠になります。とにかく、クラスはまだ生きていますが、間違いなく例外を設定しています。答えは私をより興味深くしました...