cari
Rumahpembangunan bahagian belakangTutorial C#.Net浅析C#中的“==”和Equals的示例代码

  对于“==”和Equals大多数网友都是这样总结的:

  1. “==” 是比较两个变量的值相等。

  2. Equals是比较两个变量是否指向同一个对象。

  如:这篇文章,并以这篇文章中的例子为例。

public class Person
{
     public Person(string name)
     {
         this.Name = name;
     }

     public string Name { get; set; }
}

 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);         //true
     Console.WriteLine(a.Equals(b));    //true

     object g = a;
     object h = b;
     Console.WriteLine(g == h);         //false
     Console.WriteLine(g.Equals(h));    //true

     Person p1 = new Person("jia");
     Person p2 = new Person("jia");
     Console.WriteLine(p1 == p2);       //false
     Console.WriteLine(p1.Equals(p2));  //false
     Person p3 = new Person("jia");
     Person p4 = p3;
     Console.WriteLine(p3 == p4);       //true
     Console.WriteLine(p3.Equals(p4));  //true

     Console.ReadKey();
 }

  假如上述结论正确,“==” 是比较两个变量值相等,那么下面这句代码就不应该为True.

Console.WriteLine(a == b);         //true

  很明显,上面的两个字符串变量:a,b 是指向两个不同的对象,即它们在栈空间存储的内存地址也是不同的。但为毛它们就相等了呢?

 2.什么是运算符重载?

  运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。打个简单的比方:“+” 运算符,在“+” 两

  边全为数值类型的变量时,“+” 运算符表示数学上的“+” 意义。若“+” 运算符两边只要有一个为字符串类型,那么“+” 运算符就表示连接

  字符串的意义。这样的运算符重载实例有很多,那么这跟本文主题有毛关系?我想说的是,上面字符串变量:a , b 就是因为String类

  重载了运算符 “==”,看下列源代码:

public static bool operator == (String a, String b)
{
    return String.Equals(a, b);
}
 public static bool operator != (String a, String b)
{
    return !String.Equals(a, b);
}

  很明显String类中真的重载了“==”运算符,并且不止 “==” 还有 “!=” 哦。并且在重载运算符方法内部直接调用String类中的Equals方法,

  源代码如下:

public static bool Equals(String a, String b)
{
         if ((Object)a==(Object)b)
         {
             return true;
         }

         if ((Object)a==null || (Object)b==null)
         {
             return false;
         }

         if (a.Length != b.Length)
             return false;

         return EqualsHelper(a, b);
 }

  由上可得:“==” 运算符并不一定是比较两个变量中存储的值是否相等,这要看当前运算符在当前这个类型中是否写有重载。

 3.Equals的重写

  还是上面例子:

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);         //true
Console.WriteLine(a.Equals(b));    //true

  由上可知:a ,b 为两个不同的对象。但Equals为True,则上述:“Equals是比较两个变量是否指向同一个对象“这一结论不成立。原因

  看String类中的Equals方法:

public override bool Equals(Object obj) <br>       {
    if (this == null)                        //this is necessary to guard against reverse-pinvokes and
        throw new NullReferenceException();  //other callers who do not use the callvirt instruction

    String str = obj as String;
    if (str == null)
        return false;

    if (Object.ReferenceEquals(this, obj))
        return true;

    if (this.Length != str.Length)
        return false;

    return EqualsHelper(this, str);
}

public bool Equals(String value) <br>       {
    if (this == null)                        //this is necessary to guard against reverse-pinvokes and
        throw new NullReferenceException();  //other callers who do not use the callvirt instruction

    if (value == null)
        return false;

    if (Object.ReferenceEquals(this, value))
        return true;

    if (this.Length != value.Length)
        return false;

    return EqualsHelper(this, value);
}

  由上面可知String类中不仅重写了Object中的Equals还有自己的Equals方法,但是实现代码几乎是一样的。比较类型,内存地址,

  实际值,从而获得最终的结果。所以Equals不一定就是单一的比较引用地址是否相同,更何况我们还可以重写和自定义。但是重写

  Equals也有需要注意的地方,就是如果你需要用到HashMap,HashSet,Hashtable那么你也需要重写GetHashCode()。

 4.为什么有了“==”还要有Equals?

  中国有一句话:“任何事物的存在必然有他存在的道理和价值”,同理“==”和Equals也是一样。“==” 在引用类型中最基本的实现就是去比

  较两对象的内存地址是否一致,一致则相等反之则不等。这样的实现很明显是从硬件角度去思考的,如果两个对象相等即为同一个对象,

  那么它们在内存中的地址必然相等。但很多时候 “行为(方法)“ 是取决于我们去观察世界的角度。 如:String类型我们申明一个字符

  串更在意的是字符串所具有的实际值,而不是在意两个对象在内存中是创建了一次还是两次(即内存地址是否相等),只要它们所具有的

  实际值是相等的那么我们就认为它们是相等,这是从生活业务逻辑中去理解的而不是从机器角度上去理解的。当然上面声明相同的字符串

  变量是创建一次还是两次我想:” 常量池(或字符串拘留池)“ 已经给了我们最好的解决方案。

 5.“==”和Equals到底什么关系?

    ”==“ 运算符和Equals它们其实是互补关系。因为:”==“ 运算符主要实现形式是站在 ”计算机角度(或者说硬件角度)” 上去实现的,

  而Equals是站在常用的业务场景或者是特定的业务场景下去实现的,二者没有什么必然的联系,是根据自己的业务需要选择不同方法而已。

  所以Object里面的Equals是Visual,很多类中都重写了它,并真正达了在当前类型中所需的特定行为,即:多态。所以就不难解释上面:

object g = a;
object h = b;
Console.WriteLine(g == h);         //false
Console.WriteLine(g.Equals(h));    //true

  因为Object中没有实现重载运算符:“==”,所以当前“==”的比较方式是比较两变量在栈空间存储的内存地址是否相同。而Equals则是

  调用String类中的Equals,原因g变量在运行中它实际上指向一个字符串对象的,而当前的Object类型只是Visual studio和编译器的行为,即:还是多态。

  最后任何东西都有它的规则:”==“和Equals也不例外,详细资料请点击:跳转至MSDN。


Atas ialah kandungan terperinci 浅析C#中的“==”和Equals的示例代码. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
C# .net untuk pembangunan web, desktop, dan mudah alihC# .net untuk pembangunan web, desktop, dan mudah alihApr 25, 2025 am 12:01 AM

C# dan .NET sesuai untuk pembangunan web, desktop dan mudah alih. 1) Dalam pembangunan web, ASP.Netcore menyokong pembangunan silang platform. 2) Pembangunan desktop menggunakan WPF dan WinForms, yang sesuai untuk keperluan yang berbeza. 3) Pembangunan mudah alih menyedari aplikasi silang platform melalui Xamarin.

C# .NET Ecosystem: Rangka Kerja, Perpustakaan, dan AlatC# .NET Ecosystem: Rangka Kerja, Perpustakaan, dan AlatApr 24, 2025 am 12:02 AM

Ekosistem C#.NET menyediakan rangka kerja dan perpustakaan yang kaya untuk membantu pemaju membina aplikasi dengan cekap. 1.asp.NetCore digunakan untuk membina aplikasi web berprestasi tinggi, 2.EntityFrameworkCore digunakan untuk operasi pangkalan data. Dengan memahami penggunaan dan amalan terbaik alat -alat ini, pemaju dapat meningkatkan kualiti dan prestasi aplikasi mereka.

Menggunakan C# .NET Aplikasi ke Azure/AWS: Panduan Langkah demi LangkahMenggunakan C# .NET Aplikasi ke Azure/AWS: Panduan Langkah demi LangkahApr 23, 2025 am 12:06 AM

Bagaimana cara menggunakan aplikasi C# .net ke Azure atau AWS? Jawapannya ialah menggunakan Azureappservice dan AwselasticBeansTalk. 1. Pada Azure, mengautomasikan penggunaan menggunakan Azureappservice dan Azurepipelines. 2. Pada AWS, gunakan Amazon ElasticBeansTalk dan AWSLambda untuk melaksanakan penempatan dan pengiraan tanpa pelayan.

C# .NET: Pengenalan kepada bahasa pengaturcaraan yang kuatC# .NET: Pengenalan kepada bahasa pengaturcaraan yang kuatApr 22, 2025 am 12:04 AM

Gabungan C# dan .NET menyediakan pemaju dengan persekitaran pengaturcaraan yang kuat. 1) C# menyokong polimorfisme dan pengaturcaraan asynchronous, 2) .NET menyediakan keupayaan silang platform dan mekanisme pemprosesan serentak, yang menjadikannya digunakan secara meluas dalam pembangunan aplikasi desktop, web dan mudah alih.

Rangka Kerja .NET vs C#: Menyahkodkan istilahRangka Kerja .NET vs C#: Menyahkodkan istilahApr 21, 2025 am 12:05 AM

.NetFramework adalah kerangka perisian, dan C# adalah bahasa pengaturcaraan. 1..NetFramework menyediakan perpustakaan dan perkhidmatan, sokongan desktop, web dan aplikasi mudah alih. 2.C# direka untuk .NetFramework dan menyokong fungsi pengaturcaraan moden. 3..NetFramework Menguruskan pelaksanaan kod melalui CLR, dan kod C# disusun ke IL dan dikendalikan oleh CLR. 4. Gunakan .NetFramework untuk membangunkan aplikasi dengan cepat, dan C# menyediakan fungsi lanjutan seperti LINQ. 5. Kesilapan umum termasuk penukaran jenis dan kebuntuan pengaturcaraan tak segerak. Alat VisualStudio diperlukan untuk debugging.

Demystifying C# .NET: Gambaran Keseluruhan untuk PemulaDemystifying C# .NET: Gambaran Keseluruhan untuk PemulaApr 20, 2025 am 12:11 AM

C# adalah bahasa pengaturcaraan yang berorientasikan objek yang dibangunkan oleh Microsoft, dan .NET adalah rangka kerja pembangunan yang disediakan oleh Microsoft. C# menggabungkan prestasi C dan kesederhanaan Java, dan sesuai untuk membina pelbagai aplikasi. Rangka kerja .NET menyokong pelbagai bahasa, menyediakan mekanisme pengumpulan sampah, dan memudahkan pengurusan memori.

C# dan runtime .net: bagaimana mereka bekerjasamaC# dan runtime .net: bagaimana mereka bekerjasamaApr 19, 2025 am 12:04 AM

C# dan .NET Runtime bekerjasama rapat untuk memperkasakan pemaju untuk keupayaan pembangunan yang cekap, kuat dan silang platform. 1) C# adalah bahasa pengaturcaraan yang berorientasikan objek dan berorientasikan objek yang direka untuk mengintegrasikan dengan lancar dengan rangka .NET. 2) Runtime NET menguruskan pelaksanaan kod C#, menyediakan pengumpulan sampah, keselamatan jenis dan perkhidmatan lain, dan memastikan operasi yang cekap dan silang platform.

C# .NET Development: Panduan Pemula untuk BermulaC# .NET Development: Panduan Pemula untuk BermulaApr 18, 2025 am 12:17 AM

Untuk memulakan C# .NET Development, anda perlu: 1. Memahami pengetahuan asas C# dan konsep teras Rangka Kerja NET; 2. Menguasai konsep asas pembolehubah, jenis data, struktur kawalan, fungsi dan kelas; 3. Belajar ciri -ciri canggih C#, seperti LINQ dan pengaturcaraan asynchronous; 4. Berkenaan dengan teknik debugging dan kaedah pengoptimuman prestasi untuk kesilapan biasa. Dengan langkah -langkah ini, anda secara beransur -ansur boleh menembusi dunia C#.net dan menulis aplikasi yang cekap.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod