2017-06-08 96 views
0

我必須創建大量稍微不同的對象進行測試。所有的屬性都被修改爲不同的對象,但是一旦我創建了對象&就可以做到這一點,我不再需要它了。 我應該創建一個新的本地對象還是剛剛覆蓋&重新分配循環範圍之外的對象?C#創建新對象vs覆蓋現有對象(性能)

新(本地)對象

int testCases = 10; 
for(int i=0; i<testCases; i++){ 
    TestObject localObject = new TestObject(); //local variable for the loop 
    //change properties & do stuff with the test object 
} 

重新分配/覆蓋現有對象

TestObject myObject; 
int testCases = 10; 
for(int i=0; i<testCases; i++){ 
    myObject = new TestObject(); //reassign object that exists outside the loop 
    //change properties & do stuff with the test object 
} 

「更改屬性&做的東西」 不是那麼重要,我知道如何創建我的對象的不同版本,只是不知道我是否應該摧毀他們每個迭代

+3

您不重新分配對象,您創建一個新實例並將該實例分配給該變量。 –

+6

新實例是在兩個版本中創建的,所以它並不重要。如果你不在循環外部使用'myObject',那麼編譯器會優化它。 – Maarten

回答

4

您發佈的兩個代碼片段之間沒有功能差異。無論您將局部變量放在代碼中的哪個位置,分配都會在每次循環迭代中發生。

如果你想節省分配,不過,我能想到的兩種可能的解決方案爲您提供:

  1. 使用結構,而不是階級 - 這將導致用於代替堆唯一的堆棧空間。只有堆使用量會導致GC壓力。但是,如果你經常在結構體周圍傳遞,你需要通過ref來傳遞,而不是通過值來避免複製。結構也「想」是不可改變的,所以你在使用它們的方式上有一點限制,但通常不是什麼大問題。如果您需要了解更多關於結構/值類型的信息,請參閱here

  2. 使用對象復位/再利用語義 - 而不是分配一個新的對象,並用數據填充它,只需加用數據一遍又一遍相同的對象,而沒有重新分配它。你基本上把這個對象當作一個共享對象。在非平凡的情況下,合併可能會變得非常複雜,但在某些情況下避免額外內存壓力是一種好方法。

+0

哦,現在我看到我正在創建新的對象。我對將對象保存到另一個變量會做什麼感到困惑 – SleekPanther