これは、空の文字配列から空文字列を作成するために特殊なケースが作成されたためです。 (これはchar*
パラメータのコンストラクタです)reference source for stringから
string x = new string(new char[0]);
string y = new string(new char[0]);
Console.WriteLine(object.ReferenceEquals(x, y)); // true
Console.WriteLine(object.ReferenceEquals(x, string.Empty)); // true
:文字列コンストラクタはこのように構成され、空の文字列をstring.Empty
を返すも
[System.Security.SecurityCritical] // auto-generated
private unsafe String CtorCharPtr(char *ptr)
{
if (ptr == null)
return String.Empty;
#if !FEATURE_PAL
if (ptr < (char*)64000)
throw new ArgumentException(Environment.GetResourceString("Arg_MustBeStringPtrNotAtom"));
#endif // FEATURE_PAL
Contract.Assert(this == null, "this == null"); // this is the string constructor, we allocate it
try {
int count = wcslen(ptr);
if (count == 0)
return String.Empty;
String result = FastAllocateString(count);
fixed (char *dest = result)
wstrcpy(dest, ptr, count);
return result;
}
catch (NullReferenceException) {
throw new ArgumentOutOfRangeException("ptr", Environment.GetResourceString("ArgumentOutOfRange_PartialWCHAR"));
}
}
そして(これはのコンストラクタですchar[]
パラメータ):
[System.Security.SecuritySafeCritical] // auto-generated
private String CtorCharArray(char [] value)
{
if (value != null && value.Length != 0) {
String result = FastAllocateString(value.Length);
unsafe {
fixed (char * dest = result, source = value) {
wstrcpy(dest, source, value.Length);
}
}
return result;
}
else
return String.Empty;
}
注ライン:
if (count == 0)
return String.Empty;
と
else
return String.Empty;
彼らは二つの等しいオブジェクトだから... '' Equals'を上書きしますSTRING'。なぜあなたはそれが 'false'を印刷することを期待しましたか? –
( 'objectを呼び出すことを意味しましたか?参照Equals'の代わりに?Equals'の代わりに?) –
@JonSkeetはい、申し訳ありません、私は実験でコードを変更しました:P –