15

C#では、2つのオブジェクトで「==」演算子と比較すると、バックグラウンドで正確に何が起こりますか?アドレスを比較するだけですか?または、Equals()やCompareTo()のようなものですか?

PS:Javaの "=="演算子はどうですか?同じように動作しますか?

4

6 に答える 6

24

私の知る限りでは:

  • 値タイプを値(等式)で比較します
  • 参照タイプを参照(ID)で比較します
  • ==演算子がオーバーロードされている場合を除いて、それを呼び出します。

Equalsはオブジェクトに実装されており、オーバーライドすることもできます。Objectのデフォルトの実装は、参照型の参照比較を実行します。したがって、デフォルトでは、Equalsと==は同じことを行います。

Javaでは==演算子をオーバーロードできないと思います。しかし、私のJavaの知識はかなり時代遅れです。

編集:==演算子は静的メソッドである ことに注意してください。変数またはフィールドのタイプに基づいて、コンパイル時にバインドされます。Equalsは、実際のランタイムタイプに基づいて、実行時に検出される仮想メソッドです。

于 2009-04-30T09:06:15.457 に答える
9

Stefanの優れた答えの拡張として、オペランドに含まれる場合は別の例外がありますNullable<T>。この場合、「リフトされた」演算子が適用されます(ECMA 334v4の14.2.7)。

等式演算子の場合==!=

オペランドタイプが両方ともnull許容でない値タイプであり、結果タイプがboolである場合、演算子のリフト形式が存在します。持ち上げられたフォームは、単一の?を追加することによって構築されます。各オペランドタイプの修飾子。解除された演算子は、2つのnull値が等しいと見なし、null値がnull以外の値と等しくないと見なします。両方のオペランドがnull以外の場合、リフトされた演算子はオペランドのラップを解除し、基になる演算子を適用してブール結果を生成します。

つまり、次のようになります。(たとえば)間に等式演算子があるため:

int i = ..., j = ...;
bool eq = i == j;

したがって、次の形式の暗黙の演算子があります(ただし、方法は異なります)。

int? i = ..., j = ...;
bool eq;
if(i.HasValue) {
    if(j.HasValue) { // both have values; compare
       eq = i.GetValueOrDefault() == j.GetValueOrDefault();
    } else { // one null; always false
       eq = false;
    }
} else { // true if both null, else false
    eq = !j.HasValue;
}
于 2009-04-30T09:18:28.563 に答える
4

MSDNから

事前定義された値型の場合、等価演算子(==)は、オペランドの値が等しい場合はtrueを返し、そうでない場合はfalseを返します。文字列以外の参照型の場合、2つのオペランドが同じオブジェクトを参照している場合、==はtrueを返します。文字列タイプの場合、==は文字列の値を比較します。

于 2009-04-30T09:06:56.220 に答える
3

いいえ...==演算子は、JavaとC#で常に同じように動作するとは限りません。

たとえば、文字列を使用します。Java ==は文字列オブジェクトの参照を比較します...(primitveタイプを使用する場合、Javaの==は値を比較します)。それが理由です

// returns FALSE in JAVA
(new String("test") == "test") 

Javaではtrueを返しません...

対照的に、C#では、==演算子は文字列に対して異なる動作をします。たとえば、次の場合はtrueを返します。

// returns TRUE in C#
(new String("test".ToCharArray()) == "test") 
于 2009-04-30T09:07:22.037 に答える
1

それが何をするかは文脈に依存します。

http://en.csharp-online.net/ECMA-334:_14.9_Relational_and_type-testing_operators

于 2009-04-30T09:06:43.113 に答える
0

==演算子の動作は、適用する変数がどのように宣言されたかによって異なります(オブジェクトのクラスではなく、例を追加します)。

値型の場合、それらの値を比較します。

参照型の場合、==演算子がオーバーロードされていない限り、aがbと同じオブジェクトである場合、a==bはtrueを返します。他の人が言ったようにオーバーライドされませんが、仮想ではないため、c#の演算子をオーバーライドすることはできません。

object obj_a, obj_b; string str_a, str_b;

        str_a = "ABC";
        str_b = new string("ABC".ToCharArray());
        obj_a = str_a;
        obj_b = str_b;

        Console.WriteLine("str_a == str_b = {0}", str_a == str_b); // in string == operator is overloaded
        Console.WriteLine("str_a.Equals(str_b) = {0}", str_a.Equals(str_b)); // string overrides Object.Euqals
        Console.WriteLine("obj_a == obj_b = {0}", obj_a == obj_b); // in object == operator is not overloaded
        Console.WriteLine("obj_a.Equals(obj_b) = {0}", obj_a.Equals(obj_b)); // Object.Equesl is virtual and overridden method from string will be executed.
        Console.ReadKey();

そのプログラムの出力は

str_a == str_b = True
str_a.Equals(str_b)= True
obj_a == obj_b = False
obj_a.Equals(obj_b)= True

于 2009-08-17T15:10:55.333 に答える