Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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/2/.net/25.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/0/docker/10.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# 声明变量in/out之间有什么区别吗?_C#_.net - Fatal编程技术网

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();
}