一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - C#中的Equals、RefrenceEquals和==的區別與聯系

C#中的Equals、RefrenceEquals和==的區別與聯系

2019-10-13 14:18C#教程網 ASP.NET教程

C#中判斷兩個對象是否相等有Equals、RefrenceEquals和==三種,其中==為運算符,其它兩個為方法,而Equals又有兩種版本,一個是靜態的,一個是虛擬的,詳細了解可以參考本文

C#中判斷兩個對象是否相等有Equals、RefrenceEquals和==三種,其中==為運算符,其它兩個為方法,而Equals又有兩種版本,一個是靜態的,一個是虛擬的,虛擬的可以被實體類重寫,靜態的在方法體內也是調用虛擬的,如下: 

復制代碼代碼如下:


public static bool Equals(object objA, object objB) 

return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB))); 

public virtual bool Equals(object obj) 

return InternalEquals(this, obj); 

[MethodImpl(MethodImplOptions.InternalCall)] 
internal static extern bool InternalEquals(object objA, object objB); 
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
public static bool ReferenceEquals(object objA, object objB) 

return (objA == objB); 


以上為reflector反編譯的代碼。它們的區別與聯系總結如下: 
1. RefrenceEquals顧名思義,在任何情況下都是判斷兩個對象的引用是否相等,對于值類型,因為每次判斷前都必須進行裝箱操作,也就是每次都生成了一個臨時的object,因而永遠返回false。String類型比較特殊,只要字符相同永遠是同一個引用,字符不同就是不同的引用,即使通過傳遞賦值如:string str1 = "a"; string str2 = str1; str2 = "b";這時str1,str2依舊是不同引用。 

2. ==與Equals并無本質區別,它們大多數情況下都是一樣的,對于基本值類型,判斷的是值是否相等,對于引用類型,判斷的則是引用是否一樣。值得注意的是,自定義的值類型struct,本身并不支持運算符==,強行使用將會出現編譯錯誤。并且,鑒于Equals是虛方法,它可以被具體類重寫,因此需要具體問題具體分析。 

3. 前面提過,靜態的Equals本質上也是調用虛擬的Equals,它們的區別在于調用時,虛擬的要考慮對象是否為空,否則會拋異常,而靜態的則無需考慮。 
以下為測試代碼: 

復制代碼代碼如下:


class Program 

static void Main(string[] args) 

//AAA a1 = new AAA { Name = "a1", Age = 22 }; 
//AAA a2 = new AAA { Name = "a1", Age = 22 }; 
//int a1 = 123; 
//int a2 = 123; 
string a1 = "abc"; 
string a2 = "abc"; 
Console.WriteLine(string.Format("==: {0}", a1 == a2)); 
Console.WriteLine(string.Format("Equals: {0}", a1.Equals(a2))); 
Console.WriteLine(string.Format("Static Equals: {0}", Object.Equals(a1, a2))); 
Console.WriteLine(string.Format("ReferenceEquals: {0}", ReferenceEquals(a1, a2))); 
Console.Read(); 


// Class or Struct 
struct AAA 

public string Name { get; set; } 
public int Age { get; set; } 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产夜趣福利第一视频 | 国产日韩一区二区三区 | 毛片一区二区三区提莫影院 | 91精品国产高清久久久久久91 | 2020年精品国产午夜福利在线 | 免费一级毛片完整版在线看 | 白丝h视频 | 国产精品久久久久久搜索 | a级亚洲片精品久久久久久久 | tolove第一季动画在线看 | 艹出白浆 | 91夜色视频 | aaa一级毛片免费 | 精品国产一区二区三区在线观看 | 四虎欧美| 久久精品亚洲牛牛影视 | 亚洲国产精品久久精品怡红院 | 午夜久| 国产精品激情综合久久 | 国产区成人综合色在线 | 日韩欧美精品一区二区 | 日韩性生活片 | 免费网址在线观看入口推荐 | 色鬼网 | 天天爽视频 | 91系列在线观看免费 | 亚洲 日本 天堂 国产 在线 | 日本www午夜色在线视频 | 国产一区二区三区四 | 黑人好大好硬好深好爽想要h | xxxxxx日本处大片免费看 | 国产午夜精品福利 | 精品国产日韩亚洲一区在线 | 亚洲欧美日韩综合在线播放 | 91精品大神国产在线播放 | 国产精品欧美亚洲韩国日本 | 亚洲九九爱 | 大胆国模一区二区三区伊人 | 成人福利视频网址 | 久久三级网站 | 啪啪无尽3d动漫漫画免费网站 |