定位使用块的区别

时间:2013-09-11 17:01:46

标签: c# using ref

有什么区别:

案例1:

var reader = cmd.ExecuteReader();
using(reader)
{
     while(reader.read())
     {
         DoSomething(ref reader);
     }
}

案例2:

using(var reader = cmd.ExecuteReader())
{
     while(reader.read())
     {
         DoSomething(ref reader);
     }
}

案例1:不会产生任何编译器错误,但using块内的reader变量下会显示一条警告行,警告显示:

可能不正确地分配给本地“变量”,这是usinglock语句的参数。 Dispose调用或解锁将在本地的原始值上进行。

http://msdn.microsoft.com/en-us/library/zhdyhfk6%28v=vs.90%29.aspx

案例2:由于将using变量限制为只读访问,因此产生编译错误。

忽略使用ref的必要性,这是否意味着在案例1中,reader变量不会被处置,或至少按“预期”处理?为什么案例1不会产生任何编译错误,但案例2呢?

1 个答案:

答案 0 :(得分:2)

using语句中声明的变量是只读的(初始化后无法分配)。
因此,您无法将其作为ref参数传递,因为要分配ref个参数。

在您的第一个示例中,变量在using语句中不是声明,因此它不是只读的。

它给出了编译器警告,原因与第二个变量是只读的相同。

原因是(作为警告状态)using语句只会处理变量的原始值。