私はそれが一種のばかげた質問であることを知っていますが、これら2つの違いが何であるかを正確に知りたいです(文字列 a = "" と文字列 a = null の違いを理解しています):
string a;
string a = null;
私はそれが一種のばかげた質問であることを知っていますが、これら2つの違いが何であるかを正確に知りたいです(文字列 a = "" と文字列 a = null の違いを理解しています):
string a;
string a = null;
ローカル変数の場合、最初の形式は変数を宣言するだけで、2 番目の形式は宣言して代入します。入力パラメーターを使用してメソッドを呼び出す、またはメソッドから戻るなど、変数に対するほとんどの操作では、パラメーターとして使用される変数が割り当てられている必要があります。
string a;
MethodThatTakesAString(a); // compile time error: use of unassigned local variable 'a' !
out
パラメーターにはその要件がないことに注意してください。コンパイラーa
は、メソッド呼び出しの後に割り当てられていると見なします。
string a;
MethodThatGivesAString(out a);
詳細については、こちらを参照してください。
答えは、前述の宣言のスコープによって異なります。ローカル スコープでは、最初の変数は割り当てられていませんが、2 番目の変数は割り当てられています。
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";
...初期化されていない変数を使用しようとしていることを示すコンパイル エラーが表示されます。
ただし、2 行目では、変数を値 (null、実際には「値なし」を意味する識別子ですが、別の方法で) に初期化します。少なくとも、コンパイラは、「ねえ、この変数には空中に放っておくのではなく、