一个简单判等例子的深度分析
今兒給網友講解了一個判等的問題,看似簡單,其實還是蠻有意思的:
object?s?=?1,?t?=?1;Console.WriteLine( "s?==?t?->?{0}",?s?==?t );
Console.WriteLine( "s.Equals(t)?->?{0}",?s.Equals( t ) );
//?運行結果:
//?s?==?t?->?False
//?s.Equals(t)?->?True
這個結果可能會讓不少同學覺得意外,那我就來給大家分析下
?
這里,我們看到給兩個object變量做了初始化,其中伴隨著裝箱操作,
?
所謂裝箱,簡單地說,就是把值類型轉換成引用類型的操作——object:引用類型,int:值類型
詳細的可以看這篇文章:C# 裝箱和拆箱
?
我們知道,對于值類型(Int32是值類型)的判等,是二進制的按位判等; 而對引用類型(object是引用類型)的判等,默認為判斷兩者內存地址是否一致。
這里的object對象,s和t分別初始化,所以地址定然不一致
可以是用object.ReferenceEquals方法驗證一下:
?
Console.WriteLine( "ReferenceEquals(s,?t)?->?{0}",?object.ReferenceEquals( s, t ) );//?運行結果:
//?ReferenceEquals(s,?t)?->?False
?
?
結果得到證實,所以 s == t自然就False了
?
?
相比而言,后面的表達式s.Equals(t)就會復雜一些
我查看了object.Equals( object )這個方法的代碼(用的Reflector):
public?virtual?bool?Equals( object?obj ){
??? return?RuntimeHelpers.Equals( this,?obj );
}
?
再去查看了RuntimeHelpers.Equals( object, object )的代碼,最后發現這是個CLR實現的方法,沒有代碼···
仔細想想,關鍵不在RuntimeHelpers.Equals, 而在這個virtual
對了,這是個虛方法,Int32類型必然會重寫這個Equals方法。也就是說,在程序中,實際調用的應該是Int32.Equals
?
再看Int32的Equals方法,結果就明朗了
public?override?bool?Equals(?object?obj?){
????return?(?(obj?is?int)?&&?(?this?==?(?(int)?obj?)?)?);
}
?
在這里,s和t都被轉換成int類型,再做值類型的按位比較,結果當然是1等于1,返回True
?
參考:
?
C# 裝箱和拆箱?
詳解.NET中六個你必須知道的重要概念?
?
?
轉載于:https://www.cnblogs.com/Realh/archive/2011/01/23/1942719.html
總結
以上是生活随笔為你收集整理的一个简单判等例子的深度分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装中文VS2008 SP1之后 智能提
- 下一篇: Sam Palmisano Reveal