C# 中 ==和equals的区别

不想说太多,直接上代码,这两个就没什么联系,有自己独立的规则。联系在一起其实不利于记忆。

下面是测试代码

            Console.WriteLine("--equals和==的区别--");
            Console.WriteLine("1、对于值类型的数据");
            Console.WriteLine();
            Console.WriteLine("1.1、类型和数学上的值都相同的数");
            Console.WriteLine($"(int)1 == (int)1 的结果是:{(int)1 == (int)1}");
            Console.WriteLine($"(int)1).Equals((int)1) 的结果是:{((int)1).Equals((int)1)}");

            Console.WriteLine("1.2、对于类型不同但是数学上值相同的数");
            Console.WriteLine($"(int)1 == (long)1 的结果是:{(int)1 == (long)1}");
            Console.WriteLine($"(int)1 == (double)1 的结果是:{(int)1 == (double)1}");
            Console.WriteLine($"(int)1 == (double)1.0 的结果是:{(int)1 == (double)1.0}");
            Console.WriteLine($"(int)1 == (decimal)1 的结果是:{(int)1 == (decimal)1}");
            Console.WriteLine($"(int)1 == (decimal)1.0 的结果是:{(int)1 == (decimal)1.0}");
            Console.WriteLine($"((int)1).Equals((long)1 的结果是:{((int)1).Equals((long)1)}");
            Console.WriteLine();

            Console.WriteLine("2、对于引用类型的数据");
            Console.WriteLine();
            Console.WriteLine("2.1、在1.1的基础上转化为object再比较");
            Console.WriteLine($"(object)(int)1 == (object)(int)1 的结果是:{(object)(int)1 == (object)(int)1}");
            Console.WriteLine($"((object)(int)1).Equals((object)(int)1 的结果是:{((object)(int)1).Equals((object)(int)1)}");
            Console.WriteLine();

            Console.WriteLine("2.2、在1.2的基础上转化为object再比较");
            Console.WriteLine($"(object)(int)1 == (object)(long)1 的结果是:{(object)(int)1 == (object)(long)1}");
            Console.WriteLine($"((object)(int)1).Equals((object)(long)1 的结果是:{((object)(int)1).Equals((object)(long)1)}");
            Console.WriteLine();
            Console.ReadKey();

 

打印如下:

--equals和==的区别--
1、对于值类型的数据

1.1、类型和数学上的值都相同的数
(int)1 == (int)1 的结果是:True
(int)1).Equals((int)1) 的结果是:True
1.2、对于类型不同但是数学上值相同的数
(int)1 == (long)1 的结果是:True
(int)1 == (double)1 的结果是:True
(int)1 == (double)1.0 的结果是:True
(int)1 == (decimal)1 的结果是:True
(int)1 == (decimal)1.0 的结果是:True
((int)1).Equals((long)1 的结果是:False

2、对于引用类型的数据

2.1、在1.1的基础上转化为object再比较
(object)(int)1 == (object)(int)1 的结果是:False
((object)(int)1).Equals((object)(int)1 的结果是:True

2.2、在1.2的基础上转化为object再比较
(object)(int)1 == (object)(long)1 的结果是:False
((object)(int)1).Equals((object)(long)1 的结果是:False

 

 

还是给个说明吧:

Equals具体的用发应该看类型自己的实现。

对于int型的比较代码是这样定义的:如果比较的是int型,返回使用==比较的结果;如果不是,先判断是不是int型,不是直接返回false,是再返回使用==比较的结果。

int 的Equals方法只支持int和object两种,如果传入其他类型,会自动转化为object。如((int)1).Equals((long)1 等价于 ((int)1).Equals((object)(long)1

        [__DynamicallyInvokable]
        public override bool Equals(object obj)
        {
            if (!(obj is int))
            {
                return false;
            }
            return this == (int)obj;
        }

        [NonVersionable]
        [__DynamicallyInvokable]
        public bool Equals(int obj)
        {
            return this == obj;
        }

 

posted @ 2019-05-31 10:04  胡正  阅读(1136)  评论(0编辑  收藏  举报