私が宣言するとき
string x = new string(new char[0]);
問題なく動作します。私の質問は、 x に割り当てられる値は何ですか?
私がチェックするとき
Console.WriteLine(x.CompareTo(null)==0);,it returns false.
私が宣言するとき
string x = new string(new char[0]);
問題なく動作します。私の質問は、 x に割り当てられる値は何ですか?
私がチェックするとき
Console.WriteLine(x.CompareTo(null)==0);,it returns false.
新しい char[0] を割り当てると、文字列は null ではありません。それは空です。
あなたができる:
Console.WriteLine(string.IsNullOrEmpty(x));
x
と同じ空の文字列になりますx = ""
。
null
と""
は、2 つの異なる文字列値です。特に、null
は null 参照であるため、インスタンス メンバーを呼び出すことはできません。したがって、x
が null の場合、x.Length
がスローされNullReferenceException
ます。
対照的に、""
(またはString.Empty
) はたまたま 0 文字を含む通常の文字列です。そのインスタンス メンバーは正常に機能"".Length
し、0 に等しくなります。
文字列がnull
空かどうかを確認するには、 (surprise) を呼び出しますString.IsNullOrEmpty
。
ここで興味深いケースを選んだのは、.NET では最小の驚きの原則に違反しているためです。実行するたびに
string x = new string(new char[0]);
同じ文字列への参照を取得します。
(編集:これについて非常に明確にするために-これはnull以外の参照です。コンストラクターの他の形式を使用した場合、または文字列リテラルを使用した場合と同様に、文字列を参照します。)
以前は "" とは別の文字列を参照していたと思いますが、今では同じもののように見えます。
using System;
public class Test
{
static void Main()
{
object x = new string(new char[0]);
object y = new string(new char[0]);
object z = "";
Console.WriteLine(x == y); // True
Console.WriteLine(x == z); // True
}
}
私の知る限り、これは、クラスの呼び出しが既存のオブジェクトへの参照を返すことができる唯一のケースです。new
文字列は null ではなく、空です。
Console.WriteLine(x.CompareTo(String.Empty)==0);
代わりにこれを試してください:
Console.WriteLine(x.CompareTo(string.Empty) == 0);