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