ホームページ >バックエンド開発 >C#.Net チュートリアル >C# の等しいと == の違いは何ですか

C# の等しいと == の違いは何ですか

高洛峰
高洛峰オリジナル
2016-12-16 10:30:261716ブラウズ

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

出力結果

tru​​e、true、false、true、false、false、true、true。

概要は次のとおりです:


1. 値の型の場合、== と等しいは同等であり、どちらも格納されている情報の内容を比較します。
2. 参照型の場合、== はスタック内の参照型のアドレスを比較し、equals メソッドはマネージド ヒープに格納されている参照型の情報の内容を比較します。
3. string クラスは特別な処理が必要です。これは、equals メソッドと == を内部で処理済みのクラスであるため、== と equals は同等であり、どちらも格納されている情報の内容を比較します。
4. 一部のカスタマイズされたクラスでは、equals メソッドをオーバーロードする必要があります。それ以外の場合は、デフォルトで基本クラスの equals メソッドが使用されます (基本クラスが Equals メソッドをオーバーロードしない場合、それは Object クラスの Equals メソッドになります)。それらの比較もまた、参照型の内容ではなく、アドレスによってマネージド ヒープに情報が格納されます。


C# における等しいと == の違いに関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。