C# 声明变量in/out之间有什么区别吗?
可能重复:C# 声明变量in/out之间有什么区别吗?,c#,.net,C#,.net,可能重复: 大家好 两个例子之间有什么区别或者有什么区别 例1: for(int i=0;i
大家好 两个例子之间有什么区别或者有什么区别 例1:
for(int i=0;i<2;i++)
{
线程newThread=新线程(…);
newThread.Start();
}
例2:
threadnewthread;
对于(int i=0;i<2;i++)
{
newThread=新线程(…);
newThread.Start();
}
它们的IL代码相同…在第二个示例中,您可以使用
newThread
访问最后一个线程,这在第一个示例中是不可能的
还有一个区别:第二个示例保存对最后一个线程的引用,因此垃圾收集器无法在线程完成并可以被释放时释放内存
new
关键字分配内存,因此内存分配没有差异(请参阅)。差异显然是变量的范围
在第一个示例中,线程
实例在循环之后将不再有引用
在第二个示例中,
Thread
实例在循环后仍将有一个引用,并且仅在包含块结束时才会释放该引用。唯一的区别是newThread
变量的范围
在第一个示例中,只能从循环中访问它;在第二个示例中,您还可以在循环之后访问它
尽可能地限制作用域,因此如果只能在循环中访问,请选择第一个,否则选择第二个。在第一个示例中,
newThread
仅限于循环中的作用域。在第二个示例中,newThread
存在于for循环之外的作用域中
如果没有对循环外的任何其他内容使用
newThread
,则应该在循环内声明它,这样就可以清楚地看到,您只是在使用循环生成线程。yes@dtb提到了一个精确的重复,并且该重复有一个更精确的答案,如果第二个例子中的newThread在循环之后的任何地方都没有被引用,它将立即可用于垃圾收集。这就是为什么在某些情况下需要GC.KeepAlive(object)的原因。好吧,我认为引用本身不允许GC收集字段。
for (int i = 0; i < 2; i++)
{
Thread newThread = new Thread( ... );
newThread.Start();
}
Thread newThread;
for (int i = 0; i < 2; i++)
{
newThread = new Thread( ... );
newThread.Start();
}