有什么区别:
案例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变量下会显示一条警告行,警告显示:
可能不正确地分配给本地“变量”,这是using
或lock
语句的参数。 Dispose
调用或解锁将在本地的原始值上进行。
http://msdn.microsoft.com/en-us/library/zhdyhfk6%28v=vs.90%29.aspx
案例2:由于将using
变量限制为只读访问,因此产生编译错误。
忽略使用ref
的必要性,这是否意味着在案例1中,reader
变量不会被处置,或至少按“预期”处理?为什么案例1不会产生任何编译错误,但案例2呢?
答案 0 :(得分:2)
在using
语句中声明的变量是只读的(初始化后无法分配)。
因此,您无法将其作为ref
参数传递,因为要分配ref
个参数。
在您的第一个示例中,变量在using
语句中不是声明,因此它不是只读的。
它给出了编译器警告,原因与第二个变量是只读的相同。
原因是(作为警告状态)using
语句只会处理变量的原始值。