1
2
3
4
5
6
7
8
<code>static</code> <code>void</code> <code>Main(</code><code>string</code><code>[] args)</code>
<code> </code><code>{</code>
<code> </code><code>object</code> <code>m1 =1 ;</code>
<code> </code><code>object</code> <code>m2 = 1;</code>
<code> </code><code>Console.WriteLine(m1==m2);</code>
<code> </code><code>Console.WriteLine(m1.Equals(m2));</code>
<code> </code><code>Console.Read();</code>
<code>}</code>
大家先不要去Visual Studio中运行这段代码,先猜猜此段代码的运行结果是怎样的,如果你猜测的结果和运行出来的结果完全是一致并且你也知道原因的话,那这篇文章下面的内容就没必要看下去了,如果你对运行出来的结果表示不理解的话,那请继续看下面内容的分析,相信看完你绝对可以解除你的疑惑。
上面问题的运行结果为:

==比较的是栈内的内容,对于值类型而言,”==“比较的就是两个对象的值,除字符串(字符串类型是一个特殊情况)以外的引用类型比较的就是两个引用类型在栈内的地址
Equals方法是定义在Object中的虚方法,用来比较两者引用对象的值是否相等,.NET中类型就都可以重写Equals方法,例如,在.NET中string类型就重写了Equals方法,用于比较两个字符串的值是否相等,而不是字符串引用是否相等。
有了上面的理论基础,下面就具体分析上面程序为什么会是那样的结果:
首先m1,m2都是引用类型,当执行m1==m2操作时,比较的是m1与m2在栈内地址的值是否相等,即比较的是引用,因为m1和m2指向的是托管堆中1是不同的地址(这点大家可以通过在debug状态下内存窗口中查看),所以得到的结果就自然是false
对于m1.Equals(m2)比较的是m1与m2引用的值是否相等,因为它们都是引用托管堆中1,它们地址不等,但是值是相等的,都是1,所以返回为true。
下面用一道题目测试大家的掌握程度(也是为了进一步加深理解)
9
10
11
12
13
14
<code> </code><code>string</code> <code>str1 = </code><code>"ZhangSan"</code><code>;</code>
<code> </code><code>string</code> <code>str2 = </code><code>"ZhangSan"</code><code>;</code>
<code> </code><code>string</code> <code>str3 = </code><code>new</code> <code>string</code><code>(</code><code>new</code> <code>char</code><code>[] { </code><code>'z'</code><code>, </code><code>'h'</code> <code>});</code>
<code> </code><code>string</code> <code>str4 = </code><code>new</code> <code>string</code><code>(</code><code>new</code> <code>char</code><code>[] { </code><code>'z'</code><code>, </code><code>'h'</code><code>});</code>
<code> </code><code>Console.WriteLine(</code><code>"str1 == str2 "</code> <code>+ (str1 == str2).ToString());</code>
<code> </code><code>Console.WriteLine(</code><code>"str1 Equals str2 "</code> <code>+ str1.Equals(str2));</code>
<code> </code>
<code> </code><code>Console.WriteLine(</code><code>"str3 == str4 "</code> <code>+ (str3 == str4).ToString());</code>
<code> </code><code>Console.WriteLine(</code><code>"str3 Equals str4 "</code> <code>+ str3.Equals(str4)); </code>
<code> </code>
<code> </code><code>}</code>
运行结果为:
从上面那个问题中,我又联系到了typeof与GetType的区别,所以这里就一起总结下,首先我还是由一个程序来引出它们的区别:
<code> </code><code>object</code> <code>m1 = 1;</code>
<code> </code><code>// ValueType是引用类型,因为它是类,所以返回为false</code>
<code> </code><code>Console.WriteLine(</code><code>typeof</code><code>(ValueType).IsValueType);</code>
<code> </code><code>Console.WriteLine(m1.GetType().IsValueType);</code>
要想弄明白上面的运行结果,首先我们应该理解typeof与GetType的区别(之前我认为两个的都是一样的,这是一个误区),具体的区别为:
typeof 获得类型的System.Type对象,GetType()获得当前实例的Type,
GetType()是基类System.Object的方法,只有建立了一个实例之后才能够被调用
typeof的参数只能是int, string, class,自定义类型,不能为具体实例,否则编译器会报错
知道它们的区别之后,结果也就很容易得到了,上面程序的运行结果为:
这篇文章主要是记录下自己在回答问题时所学到的内容,也希望对有同样疑惑的朋友有所帮助。
本文转自LearningHard 51CTO博客,原文链接:http://blog.51cto.com/learninghard/1271592,如需转载请自行联系原作者