C#==演算子は詳細に何をしますか?
-
03-07-2019 - |
質問
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;
}
定義済みの値タイプの場合、 等号演算子(==)は、次の場合に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")
==演算子の動作は、適用する変数がどのように宣言されたかによって異なります(オブジェクトのクラスではなく、例を追加します)。
値タイプの場合、値を比較します。
参照型の場合、==演算子がオーバーロードされていない限り、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