1

和有什么区别:

情况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 变量下会显示一条警告行,并且警告说:

可能不正确地分配给作为usingorlock语句的参数的本地“变量”。调用或解锁将Dispose发生在本地的原始值上。

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

using情况 2:由于将变量限制为只读访问,它会产生编译器错误。

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

4

1 回答 1

3

在语句中声明的变量using是只读的(初始化后不能赋值)。
因此,您不能将它们作为ref参数传递,因为ref要分配参数点。

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

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

原因是(如警告所述)该using语句只会处理变量的原始值。

于 2013-09-11T17:03:51.010 回答