string a="I am comparing 2 string";
string b="I am comparing 2 string";
if(a==b)
return true;
else
return false;
.NET コンパイラは 2 つの文字列をどのように比較しますか? 文字列は struct(int) のように機能しますか? 文字列はクラスなので、a=b は 2 つのオブジェクトを比較していることを意味しますが、2 つの値を比較したいと考えています。
string a="I am comparing 2 string";
string b="I am comparing 2 string";
if(a==b)
return true;
else
return false;
.NET コンパイラは 2 つの文字列をどのように比較しますか? 文字列は struct(int) のように機能しますか? 文字列はクラスなので、a=b は 2 つのオブジェクトを比較していることを意味しますが、2 つの値を比較したいと考えています。
String クラスは==
演算子をオーバーロードするため、 のような値の型を比較するのと同じように、文字列の値を比較しますint
。
(ちなみに、コンパイラはコード内のリテラル文字列もインターンするため、文字列変数a
とb
は実際には同じ文字列オブジェクトを参照します。これを使用Object.ReferenceEquals(a,b)
すると、 も返されtrue
ます。)
System.String
==
文字列の内容を比較するためにオーバーロードされた演算子を持つクラスです。これにより、比較では「値のような」ものでありながら、他の点では参照型であることができます。
string は参照型ですが、等価演算子 (== および !=) は、参照ではなく文字列オブジェクトの値を比較するために定義されています。これにより、文字列が等しいかどうかのテストがより直感的になります。
文字列は、コンパイラではなくランタイムによって比較されます。比較は等価演算子によって実行されます。
ここで注意すべき点が異なります。
最初に、両方の参照が最初から等しくなるように、すべての同一の定数文字列がインターンされます。したがって、ReferenceEquals()
ここで a を実行しても、結果として "true" が返されます。そのため、作成された文字列 (たとえばStringBuilder
、またはファイルからの読み取りなど) の場合にのみ、別の参照が取得されるため、参照等価比較を行うと false になります。
両方のオブジェクトがコンパイル時に文字列であることがわかっている場合、コンパイラはコードを出力して、それらの参照ではなく、それらの値 (==
オーバーロードされた operator on System.String
) を比較します。object
型参照と比較するとすぐに、これは当てはまらないことに注意してください。
文字列を値で比較する実行時チェックは行われず、コンパイラは演算子の.Equals()
呼び出しを発行しません。==
あなたの質問は少しトリッキーであることに注意してください。ReferenceEquals も true を返すためです。
これはインターニングによるものです: http://en.wikipedia.org/wiki/String_interning