剛剛在CSDN上看到有網友問這樣的問題,的確對于不清楚底下的人這是很郁悶的.
有人錯誤的把string當成值類型而分析成值類型與引用類型的不同.我們知道string其實是引用類型.
其實只要ILDASM一下macorlib.dll 可以找到一些線索. 我們知道對于 ==和!=這對運算符,其實是跟Equals()方法掛鉤的,只要看看Equals()中發生的事情,就一些都明白了:
有人錯誤的把string當成值類型而分析成值類型與引用類型的不同.我們知道string其實是引用類型.
其實只要ILDASM一下macorlib.dll 可以找到一些線索. 我們知道對于 ==和!=這對運算符,其實是跟Equals()方法掛鉤的,只要看看Equals()中發生的事情,就一些都明白了:
.method public hidebysig static bool Equals(string a, string b) cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: ldarg.1
L_0002: bne.un.s L_0006
L_0004: ldc.i4.1
L_0005: ret
L_0006: ldarg.0
L_0007: brfalse.s L_000c
L_0009: ldarg.1
L_000a: brtrue.s L_000e
L_000c: ldc.i4.0
L_000d: ret
L_000e: ldarg.0
L_000f: ldarg.1
L_0010: call bool string::EqualsHelper(string, string) //這個EqualsHelper判斷是2個參數否含有相同的字符集
L_0015: ret
}
可以看到string重寫了Object的Equals()方法,string.Equals()首先判斷是否指向同一個地址,如果是,則返回true,如果不是,再判斷是否2個字符串都不為空并含有相同的字符集,如果是,返回true,如果不是返回false.
而object的Equals()方法:調用了同名實例方法,同名實例方法又調用了InternalEquals 在這里調用結果最后是比較地址.
于是,對于具有相同字符集而位于2個不同內存位置的2個字符串,就出現了上面的結果.
浙公網安備 33010602011771號