【问题标题】:Is there any difference between declare variable in/out for? [duplicate]声明变量输入/输出之间有什么区别吗? [复制]
【发布时间】:2011-01-25 12:32:42
【问题描述】:

可能重复:
Declaring a variable inside or outside an foreach loop: which is faster/better?

大家好,

两个例子有什么区别或者有什么区别?

例 1:

for (int i = 0; i < 2; i++)
{
    Thread newThread = new Thread( ... );
    newThread.Start();
}

例 2:

Thread newThread;
for (int i = 0; i < 2; i++)
{
    newThread = new Thread( ... );
    newThread.Start();
}

它们的 IL 代码相同...

【问题讨论】:

  • 是的@dtb 提到了一个精确的欺骗,并且有一个更精确的答案,说两者都被编译为相同的 IL,所以性能上没有区别。

标签: c# .net


【解决方案1】:

在第二个示例中,您可以使用newThread 访问最后一个线程,这在第一个示例中是不可能的。

还有一个区别:第二个示例持有对最后一个线程的引用,因此垃圾收集器在线程完成时无法释放内存并且可以被释放。

new关键字分配内存,所以内存分配没有区别(见this link)。

【讨论】:

  • 如果第二个示例中的 newThread 在该循环之后的任何地方都没有被引用,它将立即可用于垃圾回收。这就是为什么在某些情况下需要 GC.KeepAlive(object)。
  • 好的,我认为引用本身不允许 GC 收集字段。
【解决方案2】:

唯一的区别是newThread 变量的范围。

在第一个示例中,它只能从循环内访问;在第二个例子中,你也可以在循环之后访问它。

尽可能限制范围,所以如果只能在循环中访问,则选择第一个,否则选择第二个。

【讨论】:

    【解决方案3】:

    在第一个示例中,newThread 被限制在循环内的范围内。在第二个示例中,newThread 存在于 for 循环之外的范围内

    如果您没有将newThread 用于循环外的任何其他内容,则应在循环内声明它,以便清楚地表明您只是在使用循环来生成线程。

    【讨论】:

      【解决方案4】:

      区别显然是变量的作用域。

      在第一个示例中,Thread 实例在循环之后将不再有引用。

      在第二个例子中,Thread 实例在循环之后仍然会有一个引用,并且只有在包含块结束时才会释放该引用。

      【讨论】:

        猜你喜欢
        • 2019-07-25
        • 2019-12-29
        • 1970-01-01
        • 2015-07-29
        • 2015-12-14
        • 2012-07-15
        • 2016-09-05
        • 2012-05-09
        • 2014-04-10
        相关资源
        最近更新 更多