一、引言

 今天在论坛中看到一位朋友提出这样的一个问题,问题大致(问题的链接为:http://social.msdn.microsoft.com/Forums/zh-CN/52e6c11f-ad28-4633-a434-fc4d09f4d23d )是这样的:

  static void Main(string[] args)
        {
            object m1 =1 ;
            object m2 = 1;

            Console.WriteLine(m1==m2);

            Console.WriteLine(m1.Equals(m2));
            Console.Read();
}                    

大家先不要去Visual Studio中运行这段代码,先猜猜此段代码的运行结果是怎样的,如果你猜测的结果和运行出来的结果完全是一致并且你也知道原因的话,那这篇文章下面的内容就没必要看下去了,如果你对运行出来的结果表示不理解的话,那请继续看下面内容的分析,相信看完你绝对可以解除你的疑惑。

二、==与Equals的区别

上面问题的运行结果为:

[C# 基础知识系列]C#中易混淆的知识点

对于结果为什么是这样的呢?这主要涉及到==与Equals方法的区别的,再讲两者的区别前,大家首先要明确——C#中有两种不同的相等:引用相等和值相等。值相等意味着两个对象保护相同的值,例如,两个值为1的整数就具有值相等性;引用相等意味着要比较的不是两个对象,而是两个对象的引用,且两者引用的是同一个对象。若要检查引用相等性,应使用 ReferenceEquals。若要检查值相等性,请使用 Equals(详细内容可以参考:http://msdn.microsoft.com/zh-cn/library/ms173147(v=vs.90).aspx )下面就看看它们直接的区别:

  • ==比较的是栈内的内容,对于值类型而言,”==“比较的就是两个对象的值,除字符串(字符串类型是一个特殊情况)以外的引用类型比较的就是两个引用类型在栈内的地址
  • Equals方法是定义在Object中的虚方法,用来比较两者引用对象的值是否相等,.NET中类型就都可以重写Equals方法,例如,在.NET中string类型就重写了Equals方法,用于比较两个字符串的值是否相等,而不是字符串引用是否相等。

有了上面的理论基础,下面就具体分析上面程序为什么会是那样的结果:

  1. 首先m1,m2都是引用类型,当执行m1==m2操作时,比较的是m1与m2在栈内地址的值是否相等,即比较的是引用,因为m1和m2指向的是托管堆中1是不同的地址(这点大家可以通过在debug状态下内存窗口中查看),所以得到的结果就自然是false
  2. 对于m1.Equals(m2)比较的是m1与m2引用的值是否相等,因为它们都是引用托管堆中1,它们地址不等,但是值是相等的,都是1,所以返回为true。

下面用一道题目测试大家的掌握程度(也是为了进一步加深理解)

          static void Main(string[] args)
        {
            string str1 = "ZhangSan";
            string str2 = "ZhangSan";
            string str3 = new string(new char[] { 'z', 'h' });
            string str4 = new string(new char[] { 'z', 'h'});
            Console.WriteLine("str1 == str2  " + (str1 == str2).ToString());
            Console.WriteLine("str1 Equals str2  " + str1.Equals(str2));
          
            Console.WriteLine("str3 == str4 " + (str3 == str4).ToString());
            Console.WriteLine("str3 Equals str4 " + str3.Equals(str4));          
         
            Console.Read();
        }
View Code

相关文章:

  • 2021-08-16
  • 2021-09-29
  • 2022-12-23
  • 2022-01-08
  • 2021-06-10
  • 2021-11-07
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-09-05
  • 2021-05-16
  • 2022-12-23
  • 2022-01-13
  • 2021-08-13
相关资源
相似解决方案