2016-05-02 6 views
3

List<T>に保存するIDisposableクラスオブジェクトを作成しました。関数/プロシージャ内のオブジェクトをList<T>に追加します。しかし、Using{}の表記法を使用すると、リスト内のオブジェクトはリスト内の「Disposed」にもなります。C#ローカルオブジェクトをリストに追加します<T>ローカルオブジェクトを破棄しますか?

List<MyObject> MyList = new List<MyObject>; 

private void AddObjects() 
{ 
    using (MyObject Mo = New MyObject()) 
    { 
     Mo.Name = "MyName"; 
     Mo.Age = 30; 
     MyList.Add(Mo); 
    } 
} 

この例では、リスト内のオブジェクト要素はNULLになります。しかし、私がコードを使用する場合:

List<MyObject> MyList = new List<MyObject>; 

private void AddObjects() 
{ 
    MyObject Mo = New MyObject() 
    Mo.Name = "MyName"; 
    Mo.Age = 30; 
    MyList.Add(Mo); 
} 

そして、すべての問題はなく、リスト内のオブジェクト要素はOKです。

質問:なぜですか?関数の完了時にMyObjectのスコープが失われますが、オブジェクトへの参照は保持されます。

は、その後、次のコードがあります:

List<MyObject> MyList = new List<MyObject>; 

private void AddObjects() 
{ 
    for (int i = 1; i < 99; i++) 
    { 
     MyObject Mo = New MyObject() 
     Mo.Name = "MyName"; 
     Mo.Age = 30 + ctr; 
     MyList.Add(Mo); 
    } 
} 

はここMyObjectには、新しいオブジェクトによって上書きされているが、古いものはとどまる - なぜ新しいオブジェクトで上書きされ、以前の言及はありませんか?

+0

'using'は、そのスコープの最後にあるオブジェクトに対してDispose()を自動的に呼び出します。 usingステートメントの外で作成されたオブジェクトにアクセスする必要がある場合は、 'using'を使用しないでください。あなたのリスト内のオブジェクトは、あなたが処分したオブジェクトと同じものです。これらのオブジェクトを使用して、自分でDispose()を呼び出します。 forループでは、98オブジェクトの新しいインスタンスを作成し、それらをListに追加します。なぜこれらの新しいオブジェクトが以前のオブジェクトを上書きすると想像しますか?ループの外側にオブジェクトを宣言しておき、それをループ内の新しいオブジェクトで上書きする必要があります。 – ManoDestra

+0

あなたの質問は少し不明です。あなたのコードの予想される動作は何ですか?実際の行動とは何ですか?オブジェクトをリストに追加してから、それを破棄します。私にとっては、あなたが説明していることは合理的な行動のように聞こえるので、あなたの実際の質問が何であるかをよりよく理解しようとしています。 –

+0

@DanForbesあなたがそれがOPが意味するものではないことを理解しているからです。それが質問の理由です。 –

答えて

4

クイック答え:

自動的に使用して文の末尾にオブジェクトを処分する新しいオブジェクトを作成しますUsing声明。これは手動でのクリーンアップの必要性を防ぐために物事を自動的に処理することです。Usingの目的です。 (MSDNのリンク:https://msdn.microsoft.com/en-us/library/yh598w02.aspx

質問2: 以下のコードでは、すべてが正常であると、リスト内のオブジェクト要素はOKです。

なぜですか?関数の完了時にMyObjectのスコープが失われますが、オブジェクトへの参照は保持されます。

List<MyObject> MyList = new List<MyObject>; 

private void AddObjects() 
{ 
    MyObject Mo = New MyObject() 
     Mo.Name = "MyName"; 
     Mo.Age = 30; 
    MyList.Add(Mo); 

} 

回答: あなたのオブジェクトがスコープ外になりましたが、MyList変数はまだあなたのMo変数に格納されたオブジェクトへの参照を保持しています。 MyListオブジェクトはまだスコープ内にあり、以前と同じオブジェクトなので、変更は保持されます。

質問3: そして、次のコードがあります:

List<MyObject> MyList = new List<MyObject>; 

private void AddObjects() 
{ 

    for (int i = 1; i < 99; i++) 
    { 
     MyObject Mo = New MyObject() 
     Mo.Name = "MyName"; 
     Mo.Age = 30 + ctr; 
     MyList.Add(Mo); 
    } 
} 
ここ

MyObjectには、新しいオブジェクトによって上書きされているが、古いものがまま - 前回の参照がで上書きされていない理由は、新しいオブジェクト?

回答3: 各ループで、Moという名前の新しい変数を作成しています。これにより、毎回新しいアドレス空間と新しいオブジェクトが作成されます。

主な回答 周囲を守りたい場合は、廃棄しないでください。あなたが欲しいときにそれらを処分する。