リヒターとこの議論から、2 つの「同一の」文字列は同じ参照であることが予想されます。しかし、今LINQPadで、このトピックについてさまざまな結果が得られました。コードは次のとおりです。
void Main()
{
string alpha = String.Format("Hello{0}", 5);
string brava = String.Format("Hello{0}", 5);
ReferenceEquals(alpha, brava).Dump();
String.IsInterned(alpha).Dump();
String.IsInterned(brava).Dump();
alpha = "hello";
brava = "hello";
ReferenceEquals(alpha, brava).Dump();
}
Dump() 呼び出しの結果は次のとおりです。
False
Hello5
Hello5
True
最初と最後の両方ReferenceEquals
がTrue
. どうしたの?
上記の例以外に、ReferenceEquals が失敗するのはどのような場合ですか? たとえば、マルチスレッド?
この問題は、たとえば、メソッドに渡された文字列パラメーターをロックが取得されるオブジェクトとして使用している場合に重要です。その場合、参照は同じである方がよい!!!