我知道这是一个愚蠢的问题,但仍然想确切地知道这两者之间的区别(我了解字符串 a = "" 和字符串 a = null 的区别):
string a;
string a = null;
对于局部变量,第一种形式只是声明一个变量,第二种是声明和赋值。对变量的大多数操作,例如使用输入参数调用方法或从方法返回,都需要对用作参数的变量进行赋值。
string a;
MethodThatTakesAString(a); // compile time error: use of unassigned local variable 'a' !
请注意,out
参数没有该要求,编译器认为a
在方法调用之后分配:
string a;
MethodThatGivesAString(out a);
更多信息可以在这里找到。
答案取决于所述声明的范围:在本地范围内,第一个变量未赋值,而第二个变量已赋值:
void foo() {
string a;
if (CheckUserInput()) {
a = "Bar";
}
Console.WriteLine(a); // << Error
}
对比
void foo() {
string a = null;
if (CheckUserInput()) {
a = "Bar";
}
Console.WriteLine(a); // << Correct
}
在类范围内,没有区别:
class X {
string a;
}
class Y {
string a = null;
}
在这两种情况下都a
以null
.
第一行只是声明了一个字符串,但未初始化。如果您尝试使用该字符串,例如:
string b = a + " says howdy";
...你会得到一个编译错误,告诉你你正在尝试使用一个未初始化的变量。
然而,第二行将变量初始化为一个值(null,这实际上是一个表示“无值”的标识符,但方式不同。至少编译器知道你明确地说“嘿,这个变量没有价值”,而不是让它悬而未决。)