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,如需轉載請自行聯系原作者