Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在哪里最好地创建对象?_C# - Fatal编程技术网

C# 在哪里最好地创建对象?

C# 在哪里最好地创建对象?,c#,C#,假设我正在使用 foreach(var v in _list) { ....stuff } 或 我想创建一个新的object实例,只在每次迭代中使用(例如,一个对象必须在每次迭代中用列表或读取器中的值填充),我应该在进入循环之前创建该对象并赋值等,然后在下一次迭代之前将该对象设为null,还是在每次迭代中创建一个新对象 我应该在进入循环之前创建对象并分配值等,然后在下一次迭代之前将对象设为null,还是在每次迭代中创建一个新对象 如果对象仅在循环体中需要,请在循环体的范围内创建它。不需

假设我正在使用

foreach(var v in _list)
{
    ....stuff
}

我想创建一个新的object实例,只在每次迭代中使用(例如,一个对象必须在每次迭代中用列表或读取器中的值填充),我应该在进入循环之前创建该对象并赋值等,然后在下一次迭代之前将该对象设为null,还是在每次迭代中创建一个新对象

我应该在进入循环之前创建对象并分配值等,然后在下一次迭代之前将对象设为null,还是在每次迭代中创建一个新对象

如果对象仅在循环体中需要,请在循环体的范围内创建它。不需要在引用的范围之外声明对象。垃圾收集器处理此类对象非常有效

没有必要取消任何内容

我应该在进入循环之前创建对象并分配值等,然后在下一次迭代之前将对象设为null,还是在每次迭代中创建一个新对象

如果对象仅在循环体中需要,请在循环体的范围内创建它。不需要在引用的范围之外声明对象。垃圾收集器处理此类对象非常有效


没有必要将任何内容置空。

我个人会在每次迭代中分配一个新对象。我怀疑这些方法会导致不同的IL,因为纯粹根据我的观察,最终会以任何一种方式重用相同的内存块,而实际发生的是每次迭代都将所有位设置为0。所以为了干净的代码,我只想写

foreach(var v in _list)
{
    MyReferenceType temp = new MyReferenceType();
    // do stuff with temp object
    // object goes out of scope here and same memory will be reused
    // when we get back to the first statement in the loop
}

我个人会在每次迭代中分配一个新对象。我怀疑这些方法会导致不同的IL,因为纯粹根据我的观察,最终会以任何一种方式重用相同的内存块,而实际发生的是每次迭代都将所有位设置为0。所以为了干净的代码,我只想写

foreach(var v in _list)
{
    MyReferenceType temp = new MyReferenceType();
    // do stuff with temp object
    // object goes out of scope here and same memory will be reused
    // when we get back to the first statement in the loop
}

没关系,编译器很可能会优化它。如果你没有在循环外使用对象,那么就在循环内使用。最好让代码是“范围安全的”。在做了一些测试之后,如果您担心性能,如果这两种样式之间存在差异,那么它非常微小,不应该担心它。这一切都归结为什么是尊重作用域的最佳实践。感谢您,将其放在上下文中,它适用于一个每天运行一次的Windows服务,并且该特定循环最多运行数千次。无论您选择哪个选项,都没有充分的理由显式为循环中的变量指定null。这无关紧要,编译器很可能会对其进行优化。如果没有在循环外使用对象,则在循环内使用。最好让代码是“范围安全的”。在做了一些测试之后,如果您担心性能,如果这两种样式之间存在差异,那么它非常微小,不应该担心它。这一切都归结为什么是尊重作用域的最佳实践。感谢您,将其放在上下文中,它适用于每天运行一次的Windows服务,特定循环最多运行数千次。无论您选择哪个选项,都没有充分的理由显式为循环中的变量指定null。谢谢,不管怎样,我就是这样拥有它的,但是我担心在每个列表/阅读中创建数千个对象可能会出现问题谢谢,我就是这样拥有它的,但是我担心在每个列表/阅读中创建数千个对象可能会出现问题