C 基礎知識系列 C 中易混淆的知識點

2022-02-05 05:03:46 字數 1877 閱讀 7178

今天在論壇中看到一位朋友提出這樣的乙個問題,問題大致(問題的鏈結為: )是這樣的:

static

void main(string

args)

大家先不要去visual studio中執行這段**,先猜猜此段**的執行結果是怎樣的,如果你猜測的結果和執行出來的結果完全是一致並且你也知道原因的話,那這篇文章下面的內容就沒必要看下去了,如果你對執行出來的結果表示不理解的話,那請繼續看下面內容的分析,相信看完你絕對可以解除你的疑惑。

上面問題的執行結果為:

對於結果為什麼是這樣的呢?這主要涉及到==與equals方法的區別的,再講兩者的區別前,大家首先要明確——c#中有兩種不同的相等:引用相等和值相等。值相等意味著兩個物件保護相同的值,例如,兩個值為1的整數就具有值相等性;引用相等意味著要比較的不是兩個物件,而是兩個物件的引用,且兩者引用的是同乙個物件。若要檢查引用相等性,應使用 

referenceequals

。若要檢查值相等性,請使用 

equals(詳細內容可以參考: )

。下面就看看它們直接的區別:

有了上面的理論基礎,下面就具體分析上面程式為什麼會是那樣的結果:

首先m1,m2都是引用型別,當執行m1==m2操作時,比較的是m1與m2在棧內位址的值是否相等,即比較的是引用,因為m1和m2指向的是託管堆中1是不同的位址(這點大家可以通過在debug狀態下記憶體視窗中檢視),所以得到的結果就自然是false

對於m1.equals(m2)比較的是m1與m2引用的值是否相等,因為它們都是引用託管堆中1,它們位址不等,但是值是相等的,都是1,所以返回為true。

下面用一道題目測試大家的掌握程度(也是為了進一步加深理解)

static

void main(string

args)

);string str4 = new

string(new

char );

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)

要想弄明白上面的執行結果,首先我們應該理解typeof與gettype的區別(之前我認為兩個的都是一樣的,這是乙個誤區),具體的區別為:

知道它們的區別之後,結果也就很容易得到了,上面程式的執行結果為:

這篇文章主要是記錄下自己在回答問題時所學到的內容,也希望對有同樣疑惑的朋友有所幫助。

C 基礎知識系列 C 中易混淆的知識點

今天在論壇中看到一位朋友提出這樣的乙個問題,問題大致 問題的鏈結為 是這樣的 static void main string args 大家先不要去visual studio中執行這段 先猜猜此段 的執行結果是怎樣的,如果你猜測的結果和執行出來的結果完全是一致並且你也知道原因的話,那這篇文章下面的內...

C 基礎知識系列 C 中易混淆的知識點

今天在論壇中看到一位朋友提出這樣的乙個問題,問題大致 問題的鏈結為 是這樣的 static void main string args 大家先不要去visual studio中執行這段 先猜猜此段 的執行結果是怎樣的,如果你猜測的結果和執行出來的結果完全是一致並且你也知道原因的話,那這篇文章下面的內...

C 易混淆知識點

c 易混淆知識點 crystal 例項 static void main string args 執行結果為 有了上面的理論基礎,下面就具體分析上面程式為什麼會是那樣的結果 首先m1,m2都是引用型別,當執行m1 m2操作時,比較的是m1與m2在棧內位址的值是否相等,即比較的是引用,因為m1和m2指...