質問

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

PS:<!> quot; == <!> quotはどうですか。 Javaの演算子?同じように動作しますか?

役に立ちましたか?

解決

私が知る限り:

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

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

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

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

他のヒント

Stefanの優れた回答の拡張機能-別の例外は、オペランドにNullable<T>が含まれる場合です。この場合、<!> quot; lifted <!> quot;演算子が適用されます(ECMA 334v4の14.2.7):

  

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

     

オペランド型が両方の場合、リフトされた形式の演算子が存在します   nullを許可しない値型、および   結果の型はブールです。リフトフォーム   単一の?   各オペランドタイプの修飾子。の   持ち上げられたオペレーターは2つのヌルを考慮します   値が等しく、ヌル値が等しくない   null以外の値。両方の場合   オペランドは非ヌル、リフト   演算子はオペランドをアンラップし、   基になる演算子を適用します   bool結果を生成します。

その意味は:(たとえば)の間に等価演算子があるためです:

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;
}

MSDNから

  

定義済みの値タイプの場合、   等号演算子(==)は、次の場合にtrueを返します。   オペランドの値が等しい、   そうでない場合はfalse。参照タイプの場合   文字列以外の場合、==は次の場合にtrueを返します。   その2つのオペランドは同じものを参照します   オブジェクト。文字列タイプの場合、==   文字列の値を比較します。

いいえ... ==演算子は、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") 

何をするかはコンテキストに依存します。

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

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

値タイプの場合、値を比較します。

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

            オブジェクトobj_a、obj_b;             文字列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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top