zoukankan      html  css  js  c++  java
  • C#中equal与==的区别

    查看判断两个对象是否是同一对象要用: Object.ReferenceEquals();

    为什么两个对象内容一样,== 还是false.

     默认情况下== 还是调用Equals 方法, Object的Equal 方法也比较了两个变量指向是否是同一个对象,

    对象如果override 了Equal 方法,就可以进行内容的相同比较。

    string 等这些类就是重写了Equals 方法。

    C#中,判断相等有两种方式,一种是传统的==操作,一种是object提供的Equals方法。二者的区别在于:

    一、==操作符判断的是堆栈中的值,Equlas判断的是堆中的值。

    C#提供值类型和引用类型,值类型存储在栈上,故用==判断是直接判断其值是否相等,因为值类型不存在堆中的数据,因此值类型的Equals也是判断数据。即,对于值类型而言,==与Equals相同,均是判断其值是否相等。

    对于引用类型而言,其栈中存储的是对象的地址,那么==就是比较两个地址是否相等,即是否指向同一个对象;Equals函数则是比较两个对象在堆中的数据是否一样,即两个引用类型是否是对同一个对象的引用。

    二、String类型特殊

    String类型虽然是引用类型,但是对String对象的赋值却按照值类型操作。

    例如:

    String s1="hello";
    String s2="hello";

    对s2初始化的时候,并没有重新开辟内存,而是直接将其地址指向s1的内容“hello”。这样一来,string类型虽然是引用类型,但是其==操作和Equals操作都是一样的,均比较值是否相等。

    三、与GetHashCode()的关系

    若两对象Equals相等,那么其GetHashCode()必定相等;但是反过来,若GetHashCode()相等,那么这两个对象Equals方法比较结果不一定相同。(为了获取最佳性能,hash函数为对象内容生成的数字是随机分布的,这就意味着,内容不同的对象,有可能生成的数字是一样的,但可以认为这种概率非常小)。

    下面示例说明:

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class People
        {
            private string name;
    
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
    
            public People(string name)
            {
                this.name = name;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                string a = "hello";
                string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
                Console.WriteLine(a == b);
                Console.WriteLine(a.Equals(b));
                Console.WriteLine("
    ");
    
                Int32 m = 3;
                Int32 n = 3;
                Console.WriteLine(n == m);
                Console.WriteLine(n.Equals(m));
                Console.WriteLine("
    ");
    
                object g = a;
                object h = b;
                Console.WriteLine(g == h);
                Console.WriteLine(g.Equals(h));
                Console.WriteLine(g.GetHashCode() + "   " + h.GetHashCode());
                Console.WriteLine("
    ");
    
                People p1 = new People("Jimmy");
                People p2 = new People("Jimmy");
                Console.WriteLine(p1 == p2);
                Console.WriteLine(p1.Equals(p2));
                Console.WriteLine(p1.GetHashCode() + "  " + p2.GetHashCode());
                Console.WriteLine("
    ");
    
                People p3 = new People("Jimmy");
                People p4 = p3;
                Console.WriteLine(p3 == p4);
                Console.WriteLine(p3.Equals(p4));
    
            }
        }
    }
    复制代码

    运行结果如下:

    True   True    True    True    False    True    -695839   -695839    False    False    46104728  12289376    True    True      请按任意键继续. . .

    在C#中,string 类型的特点有:

    (1)属于基本数据类型;

    (2)是引用类型;

    (3)只读;

    (4) string a="1123";

                string b="1123";

    那么a和b指向同一个内存地址;

    但是并非2个相同值相等的字符串就对应同一个内存地址;

    (5)2个string 类型做“==”操作,先判断内存地址是否相同,如果相同,则立即返回true;如果内存地址不相同,则继续判断值是否相同。

    下面示例说明:

    复制代码
    static void Main(string[] args)
            {
                string a = new string(new char[] { 'c', h', e',n', '1' });
                string b = new string(new char[] { 'c', h', e',n', '1' });
                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("csw");
                Person p2 = new Person("csw");
                Console.WriteLine(p1 == p2);//结果为false
                Console.WriteLine(p1.Equals(p2));//结果为false
    
    
                Person p3 = new Person("csw");
                Person p4 = p3;
                Console.WriteLine(p3 == p4);//结果为true
                Console.WriteLine(p3.Equals(p4));//结果为true
    
                Console.ReadLine();
            }
    复制代码
     
  • 相关阅读:
    [sql]mysql启停脚本
    [sh]函数+条件表达式
    【Qt开发】QT中显示图像数据
    【Qt开发】QT中显示图像数据
    【Qt开发】如何将内存图像数据封装成QImage V1
    【Qt开发】如何将内存图像数据封装成QImage V1
    【Qt开发】将内存图像数据封装成QImage V2
    【Qt开发】将内存图像数据封装成QImage V2
    【Qt开发】Qt中图像的显示与基本操作
    【Qt开发】Qt中图像的显示与基本操作
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15259275.html
Copyright © 2011-2022 走看看