0

として入力された2つの変数を比較しobject、両方に同じ値が含まれている場合、==演算子を使用した比較結果はを生成しfalseます。

object Var1 = "X";
object Var2 = "X";

// This produces false result
bool Match = Var1 == Var2;

なぜこうなった?

編集:上記は実際に機能するコードです!

私はこれをこのように見えて機能しない実際のコードに基づいています:

ChoiceValue = Choice.GetValue(FieldTemplate.ValueDataType);
if (ChoiceValue == Field.Value) RadioButton.IsChecked = true;

ChoiceValueisobjectおよびField.Valueisプロパティは。として入力されobjectます。

明らかに、さまざまな状況でさまざまに機能します。

4

6 に答える 6

9

この特定のケースが false を返す理由は、文字列がインターンされていないためです。(ストリングインターン

テストしたところ、文字列がインターンされていたため、真実でした。

あなたの場合、これにより、参照によって比較されるため、 object == 演算子が false を返します。

文字列がインターンされない理由は、動的に構築された文字列を比較しているためです (つまり、コンパイル時には認識されていませんでしたが、実行時には認識されていません)。

絶対にオブジェクト変数を使用する必要がある場合は、Equals代わりに使用する==か、手動で文字列をインターンすることができますString.Intern

このケースは、値型のように動作しようとする参照型の文字列の異常です。これは、string == 演算子を使用する場合、値で比較することを意味します。ただし、オブジェクトがある場合は、参照によって比較する object == 演算子を使用します。

これは、 stringのドキュメントで説明されています。

于 2012-07-02T12:37:02.450 に答える
7

編集した質問では==、値ではなく参照を比較するため、この動作が発生しています。

文字列値の場合、文字列インターンのために期待どおりに機能しているようです。ここで、Var1andVar2は文字列「X」の単一のコピーを指し、==参照を比較するため、真の結果が得られます。

ストリングインターン。これは、任意の文字列の 1 つのコピーを格納する方法です。

表示されることがあります:文字列のインターンを理解する

ここに画像の説明を入力

于 2012-07-02T12:29:12.123 に答える
0
Why is this happening?

false であるその値ではなく、参照に一致するためです。

文字列==でそれらの値を比較します。

試すVar1.Equals(Var2);

于 2012-07-02T12:30:11.777 に答える
0

演算子 == は、参照とその値を比較します。

(参考比較)

これは、var1がメモリ内の位置 xxxx を指しており、var2がメモリ内のyyyy を指していることを意味します。したがって、それらは異なるオブジェクトです。

コードが次の場合:

object Var1 = "X";
object Var2 = Var1;

bool Match = Var1 == Var2;

Var1Var2の両方がメモリ内の xxxx を指しているため、一致は true になり、同じオブジェクトになります。

(ディープオブジェクト比較)

Equals を使用して、オブジェクト内の値を比較できます。したがって、Var1 (xxxx の位置) と Var2 (yyyy の位置) を比較すると、両方に同じ値 (この場合は文字 X) が含まれている場合、true が返されます。それ以外の場合は false になります。そのためのコードは次のとおりです。

object Var1 = "X";
object Var2 = "X";

// This produces false result
bool Match = Var1.Equals(Var2);

注:この回答は、文字列がインターンされていない場合にのみ機能します。それらがインターンされている場合、両方のオブジェクトはメモリ内の同じ位置を指します

于 2012-07-02T12:31:28.907 に答える
0

それについてもっと読む:

C# の文字列比較メソッドの違い

C# オブジェクトの比較

http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

これが.Netでの比較を理解するのに役立つことを願っています

于 2012-07-02T12:31:47.327 に答える
0

オブジェクトの参照を比較するためです。それを行う最善の方法は、演算子をoverride Equalsor else オーバーロードすることです。==

于 2012-07-02T12:32:46.033 に答える