2015-11-20 203 views
2

我有一點C#初學者問題。但我很確定這很容易解決。在循環中創建新對象

foreach(var test in Tests) 
{ 
    object testObj = new object();    
    //Do something with the object 
} 

如果我這樣做,每次我通過循環時,對象testObj會被覆蓋。每次都可以不覆蓋它嗎? 或者我必須使用數組?

編輯:好的,對不起,我會試着更具體一些: 我的目標是在這個循環中創建一些對象,然後對每個對象調用一個新的線程。在那裏,我想對對象做些事情,當我完成時我想釋放它。

EDIT2托馬斯:

foreach (var test in Tests) 
{ 
    object testObj = new object(); 
    //Set some properties of the object 
    Thread t = new Thread(() => manager(testObj)); 
    t.Start(); 
} 

public void manager(object testObj) 
{ 
    //Do something with the object 

    //Release it 
} 
+0

你想以不同的名字創建對象> – Sajeetharan

+2

是的,這是可能的,更具體的是你面臨的問題是什麼? –

+0

爲什麼你需要在數組內創建對象? – Andrew

回答

5

你的問題有兩個方面。

  1. 變量的壽命。局部變量只存在於它定義的塊中。因此,您在foreach循環內定義了testObj。因此,它只能通過塊的一次迭代而結束生存在循環的末尾。接下來的迭代會有一個新的testObj。

因此作爲testObj在循環之外定義並因此無論迭代生活與設置的值的

object testObj 

foreach(var test in Tests) 
{ 
    testObj = new object();    
    //Do something with the object 
} 

會解決這個問題。

然後

  • 你總是設定並奪取。如果您將變量設置爲新值,則舊值將被新值覆蓋。因此你必須使用列表,數組......如果你想保存你創建的每個testObj(或者爲每個testObj使用1個變量,但通常這只是完整的初學者所做的事情,只是爲了完整而提及它並提及這是不能做的,因爲它會大大增加你的開銷)。
  • 所以,你可以這樣做:

    List testObjList = new List(); 
    
    foreach (var tests in Tests) 
    { 
        testObjList.Add(new object()); 
        // Or alternatively object testObj = new object(); testObjList.Add(testObj); 
    } 
    

    如果添加它直接到列表中(添加(新目標)),您可以存取權限它通過使用testObjList[testObjList.Count - 1](計數-1爲指標0,並開始不是1)。這與使用第二個變體的testObj時相同。

    編輯: 要在線程內使用它們,然後消除這些對象,您有2個選項。

    1)對象不具備處理任何功能,那麼你原來的代碼是有罰款:

    foreach(var test in Tests) 
    { 
        object testObj = new object();    
        //Do something with the object 
    } 
    

    目標丟失當塊結束,但是當它被真正刪除垃圾收集器決定(有一些例外情況,比如圖片,可能需要做特殊操作才能刪除它們)。

    如果你的對象是一類特殊的(可以稱之爲MYOBJECT不與正常的對象相混淆),有它提供了一個dispose功能:

    foreach(var test in Tests) 
    { 
        using (myObject testObj = new myObject()) 
        {    
         //Do something with the object 
        } 
    } 
    

    這意味着myObject的對象只活在使用塊中,另外當塊結束時(即使通過異常)執行處理部分,這應該確保垃圾回收器能夠釋放內存。

    +0

    我不認爲我的原始代碼是好的:(因爲某種程度上第一個對象在第二次出現時總是丟失通過循環 – xileb0

    +0

    @ xileb0參見問題編號1,即變量的生命週期如果你在一個塊內定義了一個變量,它只會有效/通過塊執行一次,然後被重新創建(如果是循環塊)。https://msdn.microsoft.com/en-us/library/aa691170(v=vs .71).aspx有關該主題。 – Thomas

    +0

    好吧,我明白你的意思,但有沒有辦法解決這個問題,沒有數組/列表? 我沒有配置功能順便說一句。 – xileb0

    1

    在每次迭代中創建對象的新實例是完全可以的,因爲對象僅在單個生命週期的生命週期中需要。因此,您創建的每個線程都獲得自己的testObj的實例。如果您想在循環之後對對象執行任何操作,則必須使用數組或列表或者僅使用最後一個實例來緩存循環,然後在循環之前使用object testObject並將其與每次迭代分配一次。然而,這將導致參考testObject僅包含您在上次迭代中創建的最後一個實例。

    object testObj; 
    foreach (var test in Tests) 
    { 
        testObj = new object(); // creates a new instance every iteration 
        //Set some properties of the object 
        Thread t = new Thread(() => manager(testObj)); 
        t.Start(); 
    } 
    
    // do anything with the lastly created instance 
    DoSomething(testObject);