今天在论坛中看到一位朋友提出这样的一个问题,问题大致(问题的链接为: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#中有两种不同的相等:引用相等和值相等。值相等意味着两个对象保护相同的值,例如,两个值为1的整数就具有值相等性;引用相等意味着要比较的不是两个对象,而是两个对象的引用,且两者引用的是同一个对象。若要检查引用相等性,应使用 ReferenceEquals。若要检查值相等性,请使用 Equals(详细内容可以参考:http://msdn.microsoft.com/zh-cn/library/ms173147(v=vs.90).aspx )。下面就看看它们直接的区别:
有了上面的理论基础,下面就具体分析上面程序为什么会是那样的结果:
下面用一道题目测试大家的掌握程度(也是为了进一步加深理解)
adb31a70b49" class="code_img_closed" src="/Upload/Images/2013081221/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('6f0632ef-9661-4099-bd2e-1adb31a70b49',event)" src="/Upload/Images/2013081221/2B1B950FA3DF188F.gif" alt="" />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
运行结果为:
从上面那个问题中,我又联系到了typeof与GetType的区别,所以这里就一起总结下,首先我还是由一个程序来引出它们的区别:
static void Main(string[] args) { object m1 = 1; object m2 = 1;
// ValueType是引用类型,因为它是类,所以返回为false Console.WriteLine(typeof(ValueType).IsValueType); Console.WriteLine(m1.GetType().IsValueType); Console.Read(); }
要想弄明白上面的运行结果,首先我们应该理解typeof与GetType的区别(之前我认为两个的都是一样的,这是一个误区),具体的区别为:
知道它们的区别之后,结果也就很容易得到了,上面程序的运行结果为:
这篇文章主要是记录下自己在回答问题时所学到的内容,也希望对有同样疑惑的朋友有所帮助。