2017-06-08 94 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