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には、新しいオブジェクトによって上書きされているが、古いものはとどまる - なぜ新しいオブジェクトで上書きされ、以前の言及はありませんか?
'using'は、そのスコープの最後にあるオブジェクトに対してDispose()を自動的に呼び出します。 usingステートメントの外で作成されたオブジェクトにアクセスする必要がある場合は、 'using'を使用しないでください。あなたのリスト内のオブジェクトは、あなたが処分したオブジェクトと同じものです。これらのオブジェクトを使用して、自分でDispose()を呼び出します。 forループでは、98オブジェクトの新しいインスタンスを作成し、それらをListに追加します。なぜこれらの新しいオブジェクトが以前のオブジェクトを上書きすると想像しますか?ループの外側にオブジェクトを宣言しておき、それをループ内の新しいオブジェクトで上書きする必要があります。 – ManoDestra
あなたの質問は少し不明です。あなたのコードの予想される動作は何ですか?実際の行動とは何ですか?オブジェクトをリストに追加してから、それを破棄します。私にとっては、あなたが説明していることは合理的な行動のように聞こえるので、あなたの実際の質問が何であるかをよりよく理解しようとしています。 –
@DanForbesあなたがそれがOPが意味するものではないことを理解しているからです。それが質問の理由です。 –