C#内equals和==的用法

C#内equals和==的用法

用法分三種情況

值類型的比較

对于值类型来说 两者比较的都是”内容”是否相同,即 是否一样,很显然此时两者是划等号的。

            int s1 = 18;
            int s2 = 18;
            Console.WriteLine("s1==s2 : {0}" ,(s1 == s2));
            Console.WriteLine("s1.Equals(s2) :  {0}" , s1.Equals(s2));

結果如圖
在这里插入图片描述

引用類型比較

對於引用數據類型如string的用法不一樣。
==是對兩者的地址進行比較,而equals還是比較的

  string s3 = "acv";
            string s4 = "acv";
            Console.WriteLine("s3==s4 : {0}", (s3 == s4));
            Console.WriteLine("s3.Equals(s4) :  {0}", s3.Equals(s4));

結果如圖
在这里插入图片描述
這裏會有疑問:按理説使用 == 作比較的結果是false,爲啥是True?
答案: 由于string是微软封装的一个字符串类,在内部他已经对 = = 操作符进行了重写。重写后他比较的则是两个变量的内容是否相同,

       ==的實現邏輯如下:
public static bool operator ==(string a, string b){
    return equals(a,b);
}

重写后的 = = 操作符内部调用的即是 equals 方法,所以输出的是true

自定義的其他引用類型,如Person

Person p1 = new Person(1, "qwe");
            Person p2 = new Person(1, "qwe");
            Console.WriteLine("p1==p2 : {0}", (p1 == p2));
            Console.WriteLine("p1.Equals(p2) :  {0}", p1.Equals(p2));

結果如圖
在这里插入图片描述
==的結果顯而易見,不同的對象地址肯定不一樣
但是equals的結果也是 false ,爲什麽?
原因就在于在Equals是Object中的一个虚方法,而person类中没有对她进行重写,因此此时调用的仍是父类中的Equals方法。但是父类是无法知道你都有哪些成员字段的,因此返回的是false。要想让他能够比较两个变量的内容是否相同,那就应该重写Equals方法。

private int age;
        private string name;
        public int Age { set; get; }
        public string Name { set; get; }
        public  Person(int i, string str) { 

        }
        public override bool Equals(object obj)
        {
            Person p = obj as Person;
            //對變量的所有屬性都進行比較,只有相同才返回true
            if (this.Age == p.Age && this.Name == p.Name) {
                return true;
            }else
            {
                return false;
            }
            
        }

結果如下:
在这里插入图片描述

結論

Equals比较的是变量的内容是否相同,而= =比较的则是引用地址是否相同(前提:此种类型内部没有对Equals 或= = 进行重写操作,否则输出可能会有不同)
string 类型是个特例,因为他的内部对这两个都进行了重写。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值