我注意到 Visual Studio 的一些特殊之处。首先,尝试在函数中的某个位置键入以下内容 (C#):
class Foo
{
public void Bar()
{
string s;
int i = s.Length;
}
}
现在,它会立即标记s
in s.Length
作为一个错误,说“Use of unassigned local variable 's'
”。另一方面,尝试以下代码:
class Foo
{
private string s;
public void Bar()
{
int i = s.Length;
}
}
它将编译,并强调s
in private string s
并发出警告,说“Field 'Foo.s' is never assigned to, and will always have its default value null
".
现在,如果 VS 那么聪明并且知道 s 将始终为空,那么为什么在第二个示例中获取它的长度不是错误呢?我最初的猜测是,“如果编译器根本无法完成其工作,它只会给出编译错误。从技术上讲,只要您从不调用 Bar(),代码就会运行,所以它只是一个警告。”但第一个例子的解释无效。只要您从不调用 Bar(),您仍然可以运行代码而不会出现错误。那么什么给出呢?只是一个疏忽,还是我错过了什么?
第一个例子(错误)是编译器的一个例子明确赋值 http://msdn.microsoft.com/en-us/library/aa691172%28VS.71%29.aspx跟踪并且仅适用于局部变量。由于上下文有限,编译器对这种情况有严密的控制。注意s
不为空,它是未定义的。
在第二个例子中,s
是一个字段(默认为空)。没有编译器错误,但总是会在运行时捕获。这种特殊情况可能会被捕获,但编译器通常无法检测到这种错误。
例如,您可以添加一个方法Bar2()
分配一个字符串给s
但晚于Bar()
,或者根本没有。这将消除警告,但不会消除运行时错误。
所以这是设计使然。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)