日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个简单判等例子的深度分析

發布時間:2025/5/22 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个简单判等例子的深度分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今兒給網友講解了一個判等的問題,看似簡單,其實還是蠻有意思的:

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?s?=?1,?t?=?1;

這里,我們看到給兩個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

總結

以上是生活随笔為你收集整理的一个简单判等例子的深度分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。