1
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 つの値を比較したいと考えています。

4

6 に答える 6

4

String クラスは==演算子をオーバーロードするため、 のような値の型を比較す​​るのと同じように、文字列の値を比較しますint

(ちなみに、コンパイラはコード内のリテラル文字列もインターンするため、文字列変数abは実際には同じ文字列オブジェクトを参照します。これを使用Object.ReferenceEquals(a,b)すると、 も返されtrueます。)

于 2010-04-12T10:01:28.150 に答える
0

System.String==文字列の内容を比較するためにオーバーロードされた演算子を持つクラスです。これにより、比較では「値のような」ものでありながら、他の点では参照型であることができます。

于 2010-04-12T09:57:57.800 に答える
0

string は参照型ですが、等価演算子 (== および !=) は、参照ではなく文字列オブジェクトの値を比較するために定義されています。これにより、文字列が等しいかどうかのテストがより直感的になります。

C# 文字列

于 2010-04-12T09:58:07.700 に答える
0

文字列は、コンパイラではなくランタイムによって比較されます。比較は等価演算子によって実行されます。

于 2010-04-12T10:00:00.073 に答える
0

ここで注意すべき点が異なります。

最初に、両方の参照が最初から等しくなるように、すべての同一の定数文字列がインターンされます。したがって、ReferenceEquals()ここで a を実行しても、結果として "true" が返されます。そのため、作成された文字列 (たとえばStringBuilder、またはファイルからの読み取りなど) の場合にのみ、別の参照が取得されるため、参照等価比較を行うと false になります。

両方のオブジェクトがコンパイル時に文字列であることがわかっている場合、コンパイラはコードを出力して、それらの参照ではなく、それらの値 (==オーバーロードされた operator on System.String) を比較します。object型参照と比較するとすぐに、これは当てはまらないことに注意してください。

文字列を値で比較する実行時チェックは行われず、コンパイラは演算子の.Equals()呼び出しを発行しません。==

于 2010-04-12T10:04:01.623 に答える
0

あなたの質問は少しトリッキーであることに注意してください。ReferenceEquals も true を返すためです。

これはインターニングによるものです: http://en.wikipedia.org/wiki/String_interning

于 2010-04-12T10:04:24.287 に答える