0

私が宣言するとき

string x = new string(new char[0]);

問題なく動作します。私の質問は、 x に割り当てられる値は何ですか?

私がチェックするとき

Console.WriteLine(x.CompareTo(null)==0);,it returns false.
4

5 に答える 5

7

新しい char[0] を割り当てると、文字列は null ではありません。それは空です。

あなたができる:

Console.WriteLine(string.IsNullOrEmpty(x));
于 2009-10-29T12:05:38.060 に答える
5

xと同じ空の文字列になりますx = ""

null""は、2 つの異なる文字列値です。特に、nullは null 参照であるため、インスタンス メンバーを呼び出すことはできません。したがって、xが null の場合、x.LengthがスローされNullReferenceExceptionます。

対照的に、""(またはString.Empty) はたまたま 0 文字を含む通常の文字列です。そのインスタンス メンバーは正常に機能"".Lengthし、0 に等しくなります。

文字列がnull空かどうかを確認するには、 (surprise) を呼び出しますString.IsNullOrEmpty

于 2009-10-29T12:04:50.777 に答える
4

ここで興味深いケースを選んだのは、.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

于 2009-10-29T12:07:01.317 に答える
3

文字列は null ではなく、空です。

Console.WriteLine(x.CompareTo(String.Empty)==0);
于 2009-10-29T12:05:28.323 に答える
0

代わりにこれを試してください:

Console.WriteLine(x.CompareTo(string.Empty) == 0);
于 2009-10-29T12:07:06.700 に答える