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

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

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 | 欧美亚洲天堂网 | 日本特级a禁片在线播放 | 欧美在线视频 一区二区 | 国产成人福利色视频 | 国产高清路线一路线二2022 | 亚洲天堂视频在线观看 | 秀婷程仪公欲息肉婷在线观看 | 婷婷在线成人免费观看搜索 | 青青国产成人久久激情911 | 99视频福利 | 极品奶妈漫画 | 欧美性理论片在线观看片免费 | 国产盗摄wc厕所撒尿视频 | 青草青青在线视频观看 | 欧美人妖另类性hd | 国产一级毛片国语版 | 日本视频在线观看播放 | 亚洲26uuuu最新地址 | 国产精品美女久久久久网站 | 91高清国产经典在线观看 | 我的男友是消防员在线观看 | 亚洲黄色色图 | 动漫女性扒开尿口羞羞漫画 | 禁止的爱善良的未删减版hd | 女同全黄h全肉动漫 | 包臀裙女教师波多野结衣 | 校服下的白嫩小乳尖h1v1 | 九九热只有精品 | 久久99视热频国只有精品 | 亚洲国产精品久久无套麻豆 | 亚洲午夜精品久久久久 | 国内精品一区二区在线观看 | 日本成人黄色网址 | 国产视频a区 | 四虎永久| 极端 成熟 性别 视频 | bl双性受乖调教改造身体 | 国产精品免费看久久久香蕉 | 国产好痛疼轻点好爽的视频 |