C# には、参照の等価性と値の等価性という 2 つの異なるタイプの等価性があります。
◎値の等価性とは、一般に理解されている意味での等価性であり、2 つのオブジェクトが同じ値を含むことを意味します。
◎参照の等価性とは、比較されているのが 2 つのオブジェクトではなく 2 つのオブジェクト参照であり、両方とも同じオブジェクトを参照していることを意味します。
Equals:
次のステートメントでは、x、y、z は null 以外のオブジェクト参照を表します。
* x.Equals(x) は、浮動小数点型が関係する場合を除いて true を返します。
* x.Equals(y) は y.Equals(x) と同じ値を返します。
* x と y の両方が NaN の場合、x.Equals(y) は true を返します。
* (x.Equals(y) && y.Equals(z)) は、x.Equals(z) が true を返す場合にのみ true を返します。
* x と y によって参照されるオブジェクトが変更されない限り、x.Equals(y) を連続して呼び出すと同じ値が返されます。
* x.Equals(null) は false を返します。
==:
事前定義された値型の場合、等価演算子 (==) はオペランドの値が等しい場合は true を返し、それ以外の場合は false を返します。
文字列以外の参照型の場合、2 つのオペランドが同じオブジェクトを参照する場合、== は true を返します。
文字列型の場合、== は文字列値を比較します。
Equals と ==
"== の違い: 参照変数の場合、この操作は 2 つの変数の値が等しいかどうかを比較します。これは、2 つの変数のヒープに格納されているアドレスが等しいかどうかを意味します。は同じです。つまり、スタック内は同じです。
"equals": 操作によって表される 2 つの変数が同じオブジェクトへの参照であるかどうか、つまり、ヒープ内の内容が同じかどうか。
String は特別な参照型であり、C# 言語では、文字列オブジェクトの多くのメソッド (equals() メソッドを含む) がオーバーロードされ、文字列オブジェクトが値型のように使用されます。
例
C#コード
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Person { private string name; public string Name { get { return name; } set { name = value; } } public Person(string name) { this.name = name; } } class program { static void Main(string[] args) { string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' }); string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' }); Console.WriteLine(a == b); Console.WriteLine(a.Equals(b)); object g = a; object h = b; Console.WriteLine(g == h); Console.WriteLine(g.Equals(h)); Person p1 = new Person("jia"); Person p2 = new Person("jia"); Console.WriteLine(p1 == p2); Console.WriteLine(p1.Equals(p2)); Person p3 = new Person("jia"); Person p4 = p3; Console.WriteLine(p3 == p4); Console.WriteLine(p3.Equals(p4)); Console.ReadLine(); } } }
出力結果
true、true、false、true、false、false、true、true。
概要は次のとおりです:
1. 値の型の場合、== と等しいは同等であり、どちらも格納されている情報の内容を比較します。
2. 参照型の場合、== はスタック内の参照型のアドレスを比較し、equals メソッドはマネージド ヒープに格納されている参照型の情報の内容を比較します。
3. string クラスは特別な処理が必要です。これは、equals メソッドと == を内部で処理済みのクラスであるため、== と equals は同等であり、どちらも格納されている情報の内容を比較します。
4. 一部のカスタマイズされたクラスでは、equals メソッドをオーバーロードする必要があります。それ以外の場合は、デフォルトで基本クラスの equals メソッドが使用されます (基本クラスが Equals メソッドをオーバーロードしない場合、それは Object クラスの Equals メソッドになります)。それらの比較もまた、参照型の内容ではなく、アドレスによってマネージド ヒープに情報が格納されます。
C# における等しいと == の違いに関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。