4

私はこのコードを理解しようとしています:

double b = 3;
object o = b;
Console.WriteLine(o.Equals(3));//false
Console.WriteLine(o.Equals(b));//true
Console.WriteLine( o == (object)b );//false
  1. 新しいボクシングごとに、オブジェクト b の異なる参照が作成されますか?
  2. 1. が正しい場合、o.Equals(b)なぜtrue?
  3. 参照をチェックしない場合Equals、なぜo.Equals(3)ですかfalse?

ありがとう。

4

4 に答える 4

5
  1. はい、値の型をボックス化するたびに、新しいオブジェクトが作成されます。ボクシングについてはこちら。
  2. Equals参照の等価性ではなく、値の等価性をチェックします。oとはどちらもb同じです: のdouble値を持つ a 3.0
  3. 3これは であり、intではなくdoubleEqualsコンパイラが通常行っているように、異なる型に対して互換性を持たせるための変換を行いません。o.Equals(3.0)戻りtrueます。
于 2012-11-29T08:55:24.787 に答える
2
double b = 3;

スタックに値 3 の新しい変数を作成します

object o = b;

bスタック内の同じ場所を参照するオブジェクトをヒープ内に作成するため、2 つの参照を持つ同じ変数があり、 これはボクシングです

o.Equals(3)

b ではなく値 3 を持つ新しい無名変数を作成するため、false です。

o.Equals(b) 

同じ変数なので真です

o == (object)b

==はメモリアドレス内の参照を比較しているがEquals、変数自体の値を比較しているため、false です。

于 2012-11-29T08:59:28.560 に答える
0

値型を参照型に変換しようとするたびに、新しいオブジェクト インスタンスにボックス化する必要があります。互換性を壊さずにシステムが他のことを行う方法はありません。とりわけ、ボックス化された値型は不変 (*) であると予想されるかもしれませんが、どれもそうではありません。 すべての値の型は、ボックス化すると可変オブジェクトになります。C# と vb.net は、このようなオブジェクトを変更するための便利な方法を提供していませんが、C++/CLI で記述された信頼できる検証可能なコードを使用すると、簡単に変更できます。Int32値が現在 23の を保持するヒープ オブジェクトをシステムが認識していたとしても、ステートメントObject foo = 23;は新しいInt32システムは、何かがその既存のオブジェクトの値を 57 に変更することを計画しているかどうかを知る方法がないため、値が 23 のヒープ オブジェクト。

(*)そうあるべきだと私は主張します。List<T>.Enumeratorボックス化されたすべてのオブジェクトを変更可能にするよりも、カスタマイズ可能なボックス化動作を指定できるような構造体型を提供する方がはるかに優れています。ただし、既存のコードとの互換性を完全に損なうことなく修正する方法があるかどうかはわかりません。

于 2012-12-07T23:42:16.600 に答える
0

これを参照してください 。equals の動作に関するすべてが説明されています。

于 2012-11-29T08:52:18.503 に答える