成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解C# Object.Equals函數

開發 后端
本文介紹C# Object.Equals函數,對于C# Object.Equals函數這個靜態方法來說,雖說接受參數的類型也屬于引用類型,但是不同于Object.ReferenceEquals函數,對于如下的代碼,能得出正確的結果。

可以說,C# Object.Equals函數完成判等操作,需要經過三個步驟,***步是需要根據對象所屬類型的==操作符的執行結果;第二步是判別是否為null,也是和***步一樣,需要根據類型的==操作符的執行結果;***一步要使用到類型的Equals函數的執行結果。也就是說這個靜態函數的返回結果,要取決于后面要提到的兩個判等函數。類型是否提供相應的判等函數,成為這個函數返回結果的重要因素。

那么對于C# Object.Equals函數這個靜態方法來說,雖說接受參數的類型也屬于引用類型,但是不同于Object.ReferenceEquals函數,對于如下的代碼,能得出正確的結果。

  1. int n = 10;  
  2. Debug.WriteLine( string.Format( "{0}", Object.Equals( n, n ) ) );  
  3. Debug.WriteLine( string.Format( "{0}", Object.Equals( n, 10 ) ) ); 

這是因為在此函數中要用到具體類型的兩個判等函數,不過就函數本身而言,該做的判斷都做了,因此不需要去重載添加復雜的操作。

為了更好的述說剩下兩個函數,先解釋一下等價的意義。對于等價的意義,就是自反、對稱以及傳遞。

所謂自反,即a == a;

而對稱,是a == b,則b == a;

傳遞是 a == b,b == c,則 a == c;

理解等價的意義后,那么在實現類型的判等函數也要滿足這個等價規則。

對于可以重載的兩個判等函數,首先來介紹的是類型的Equals函數,其大致形式如下:public override bool Equals( object right );

那么對于一個類型的Equals要做些什么操作呢,一般來說大致如下:

  1. public class KeyData  
  2. {  
  3. private int nData;  
  4. public int Data  
  5. {  
  6. get{ return nData; }  
  7. set{ nData = value; }  
  8. } public override bool Equals( object right )  
  9. {  
  10. //Check null  
  11. if( right == null )  
  12. return false;  
  13. //check reference equality  
  14. if( object.ReferenceEquals( this, right ) )  
  15. return true;  
  16. //check type  
  17. if( this.GetType() != right.GetType() )  
  18. return false;  
  19. //convert to current type  
  20. KeyData rightrightASKeyData = right as KeyData;  
  21. //check members value  
  22. return this.Data == rightASKeyData.Data;  
  23. }  

如上增加了一個類型檢查,即

if( this.GetType() != right.GetType() )這部分,這是由于子類對象可以通過as轉化成基類對象,從而造成不同類型對象可以進行判等操作,違反了等價關系。

除此外對于類型的Equals函數來,其實并沒有限制類型非要屬于引用類型,對于值類型也是可以重載此函數,但是我并不推薦,主要是Equals函數的參數類型是不可變的,也就是說通過此方法,值類型要經過裝箱操作,而這是比較影響效率的。

而對于值類型來說,我推薦使用***一種判等函數,即重載運算符==函數,其大致形式如下:

  1. public static bool operator == ( KeyData left, KeyData right ); 

對于一個值類型而言,其的大致形式應該如下:

  1. public struct KeyData  
  2. {  
  3. private int nData;  
  4. public int Data  
  5. {  
  6. get{ return nData;   
  7. }  
  8. set{ nData = value;   
  9. }  
  10. }  
  11. public static bool operator == ( KeyData left, KeyData right )  
  12. {  
  13. return left.Data == right.Data;  
  14. }  
  15. public static bool operator != ( KeyData left, KeyData right )  
  16. {  
  17. return left.Data != right.Data;  
  18. }  

由于==操作與!=操作要同步定義,所以在定義==重載函數的時候,也要定義!=重載函數。這也是。Net在判等操作保持一致性。那么對于***一個判等函數,這種重載運算符的方法并不適合引用類型。這就是。Net經?,F象,去判斷兩個引用類型,不要用==,而要用某個對象的Equals函數。所以在編寫自己類型的時候,要保留這種風格。

那么對于以上介紹的四種判等函數,會產生如下類似的對比表格。操作結果取決于 適用范圍 建議Object.ReferenceEquals 兩個參數對象是否屬于同一個引用 引用類型 不要用它來判斷值類型數據C# Object.Equals函數類型自身的判等函數 無限制 考慮裝箱操作對值類型數據產生的影響類型的Equals 類型重載函數 無限制考慮裝箱操作對值類型數據產生的影響類型的==重載 類型重載函數 無限制不要在引用類型中重載此運算符;那么在編寫類型判等函數的時候,要注意些什么呢,給出如下幾點建議。

首先,要判斷當前定義的類型是否具有判等的意義;

其次,定義類型的判等函數要滿足等價規則;

***一點,值類型***不要重載定義Equals函數,而引用類型***不要重載定義==操作符。

【編輯推薦】

  1. C#在應用程序間發送消息實現淺析
  2. 一些C#時間類型的入門知識
  3. C#接口和抽象類技術特點淺析
  4. 一個C#時間計算的實例
  5. C#繼承知識詳解
責任編輯:佚名 來源: IT168
相關推薦

2009-09-04 18:09:12

C# Main函數

2009-08-26 10:40:39

C# Static H

2024-03-19 14:41:08

C#操作符開發

2009-09-01 15:47:20

C#取整函數

2009-09-10 16:30:11

C#排序函數

2009-08-14 09:27:27

C#構造函數的特性

2009-08-26 18:17:26

C#基于Object解

2009-08-20 18:21:04

GetType方法C# object類

2009-08-31 09:59:13

C# CreateEm

2009-08-31 10:14:49

C# CreateEm

2009-08-31 10:28:00

C# CreateEm

2009-08-20 16:50:14

C# 16進制轉換10

2009-08-14 17:09:48

C#引用類型

2009-09-01 16:07:04

C#命名規約

2009-07-30 18:20:21

C#繼承

2009-08-24 11:23:41

C# TimeLabe

2009-09-07 16:13:56

C# MessageB

2009-07-31 14:26:38

JavaScript函C#函數

2009-07-30 15:24:13

C#析構函數C#構造函數

2009-08-10 14:43:03

C#函數Convert
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级艳情片免费观看 | 亚洲一区二区不卡在线观看 | 欧美精品片 | 亚洲三区在线观看 | 欧美一级在线观看 | 99久久婷婷| 韩日一区二区 | 亚洲精品99 | 国产欧美精品一区二区三区 | 成人av在线大片 | 国产亚洲精品精品国产亚洲综合 | 91精品国产一区二区三区 | 亚洲二区视频 | 精品视频一区二区 | 日韩在线小视频 | 国产一区二区三区四区 | 免费黄色片在线观看 | 黄色毛片在线播放 | 久久人人爽人人爽人人片av免费 | 日韩成人在线看 | 国产va| 日日操操操 | 亚洲精品乱码久久久久久按摩观 | 日韩精品1区2区 | 四虎首页 | 国产日韩精品久久 | 国产亚洲一区二区三区 | 亚洲色图婷婷 | 色视频www在线播放国产人成 | 久久91av | 一级毛片网 | 中文在线一区二区 | 国产高清在线精品 | 欧美视频精品 | 精品视频一区二区三区 | 高清视频一区二区三区 | 国产人成精品一区二区三 | 国产精品高清一区二区三区 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 奇米久久久 | 精品久久一区 |