2016-05-02 27 views
3

我創建了IDisposable類對象,我將其存儲在List<T>中。我在一個函數/過程中將對象添加到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); 
    } 
} 

在這種情況下,列表中的對象元素是零。然而,如果我使用的代碼:

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

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

然後一切都很好,並在列表中的對象要素確定。

問:爲什麼?當函數完成但對象的引用保持不變時,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'。列表中的對象與您處理的對象相同。使用這些對象,然後自己調用Dispose()。在for循環中,您正在創建98個對象的新實例並將它們添加到列表中。你爲什麼會想象這些新的對象會覆蓋以前的對象?你必須在循環之外聲明對象,然後用循環中的新對象覆蓋它。 – ManoDestra

+0

你的問題有點不清楚。你的代碼的預期行爲是什麼?什麼是實際行爲?您正在向列表中添加一個對象,然後將其處理掉。對我而言,你所描述的聽起來像是合理的行爲,所以我試圖更好地理解你的實際問題。 –

+0

@DanForbes僅僅因爲你理解它並不意味着OP就是這樣。這就是問題被問到的原因。 –

回答

4

快速回答:

一個Using語句創建一個新的對象在using語句的結束會自動處理的對象。這是Using的目的,自動處理事情,以防止需要手動清理。 (MSDN鏈接:https://msdn.microsoft.com/en-us/library/yh598w02.aspx

問題2: 用下面的代碼,一切都很好,並在列表中的對象要素確定。

爲什麼?當函數完成但對象的引用保持不變時,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的新變量。這會每次創建一個新的地址空間和一個新對象。

主要答案 如果你想讓它們保持在一定的範圍內,不要處理這些事情。當你想要他們離開時處置他們。