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

C#中自增、自減操作符重載是個怎么回事兒

開發 后端
對于C#中的自增、自減操作符重載,無論前綴式或是后綴式,都統統只需要一個實現。本文主要介紹的是C#中的自增自減操作符的重載,希望對你有幫助,一起來看。

C#中,重載自增自減操作符的語法并沒有什么特殊之處,如下:

  1. public static SomeType operator ++(SomeType some)  
  2. {   
  3. //具體實現  

對于C#中的自增、自減操作符重載,無論前綴式或是后綴式,都統統只需要一個實現。也就是說無論我是這樣:someType++,還是這樣:++someType使用SomeType類型的自增重載,上述代碼中的實現都完全足夠完成任務。但是,前綴式++與后綴式++的行為畢竟不同,為什么他們只需要一份同樣的實現就可以達到我們需要的目的了呢?

另外,重載操作符的第一原則就是不應該改變操作數對象,而應該返回一個新的對象。否則不僅很可能會令那些使用我們的重載操作符的客戶產生困惑,而且更有可能會在調試代碼的時候出現意想不到的情況。那么對于自增和自減操作符,我們是否也需要遵從此原則呢?我們又怎么能在不修改操作數的情況下,對操作數自增或者自減呢?考慮如下的實現:

  1. class SomeType   
  2. {   
  3. public int Number   
  4. getset;  
  5. }   
  6. public static SomeType operator ++(SomeType s)   
  7. {  
  8. s.Number++;   
  9. return s;   
  10. }} 

這里直接修改了操作數,并且直接返回了修改之后的操作數實例。

當我們使用SomeType的前綴自增重載時:

  1. SomeType instance = new SomeType();  
  2. instance.Number = 1;  
  3. ++instance; 

如我們所預料的,操作符重載的方法體會被執行。而且instance也確實會按照理想的方式自增。我們再來看后綴自增操作:

  1. SomeType instance1 = new SomeType();  
  2. instance1.Number = 1;  
  3. SomeType instance2 = instance1++; 

不嚴謹的思維讓我們很容易認為,現在instance1的Number應該是2,而instance2的Number應該是1。但是,事不如人愿,實際上現在的instance1和instance2的Number都是2!

這到底是為什么呢?

其實是這樣的,相比其他我們司空見慣的重載操作符如+和-,編譯器會對重載的自增和自減操作符做一些額外的處理。在我們使用自增重載的時候,如++instance,++重載的方法體會被執行。然而我們沒有想到的是,在操作符重載方法被執行完成之后,instance會被自動賦值為操作符重載方法的返回值!而這一切都是編譯的時候就安排好了的。

也就是說,如果SomeType是引用類型,則在執行完++instance語句之后,instatnce會指向那個被自增重載操作符方法所返回的對象實例。而如果SomeType是值類型,那么instance會被按照C#值類型的標準賦值方式被重載操作符方法返回的值類型賦值,也就是逐字段賦值。

當我們使用前綴式時,這一切都工作的很好。但是當我們使用后綴式時,問題就來了。在上面的使用后綴自增的例子里,首先執行了instance1的自增操作,不過接下來,實際上是使用了instance1在執行自增操作前的一個副本(對于引用類型,使用引用的副本;對于值類型,使用整個結構的副本)來對instance2賦值的。

因為我們在SomeType的自增重載的實現中,直接對操作數進行了修改,并且返回了原操作數。所以這樣一來,現在instance1和instance2現在指向的都是原操作數的實例,他們有同樣的Number也就不足為怪了。

另一個SomeType的自增重載版本是這樣的:

  1. public static SomeType operator ++(SomeType s)   
  2. {   
  3. var result = new SomeType();   
  4. result.Number++;   
  5. return result;   

這個版本的實現遵循了“不應該在操作符重載中修改操作數”的原則。如果使用了這個版本的自增重載,在上述后綴式自增的例子中,會和我們預期的一樣:instance1的Number是2,而instance1的Number是1。

我想,在很多情況下(特別是當SomeType是值類型時),這會是您希望得到的結果,也同樣是您代碼的消費者所預期的結果。

好吧,對于自增和自減操作符,我們這樣理解可能會更容易一些:例如語句“instance2 = instance1++;”,并不是將自增重載方法的返回值賦值給左值instance2,而是將自增重載方法的返回值賦值給instance1。

注意:自增重載方法的返回值是用來賦值給調用該重載方法的操作數的!(如果您有C++的背景,這一點可能不太容易接受)

【編輯推薦】

  1. C#控件的閃爍問題解決方法總結
  2. C#簡單游戲外掛制作(以Warcraft Ⅲ為例)
  3. 使用托管C++粘合C#和C++代碼(一)
  4. 使用托管C++粘合C#和C++代碼(二)
  5. 利用C#實現任務欄通知窗口
責任編輯:于鐵 來源: 博客園
相關推薦

2009-08-18 17:55:20

C#操作符重載

2021-07-30 07:28:16

偽類偽元素CSS

2017-11-24 11:10:38

區塊鏈礦工分叉

2018-05-08 08:46:47

Linux內存釋放

2021-11-01 15:35:31

C++自增自減

2009-08-18 18:06:54

C#操作符重載

2009-08-18 17:42:12

C#操作符重載

2018-01-25 16:07:41

匿名函數自執行

2009-08-18 17:34:25

C#操作符重載應用

2009-08-18 17:20:17

C#操作符重載

2009-08-19 17:26:28

C# 操作符

2009-08-21 09:30:05

is和as操作符

2023-12-26 01:09:28

MySQL存儲釋放鎖

2009-08-19 17:20:22

C# 操作符

2021-07-07 05:37:57

郵件安全網絡攻擊數據泄露

2010-02-05 10:30:02

C++操作符重載

2020-07-09 09:56:48

Python語言開發

2009-07-14 18:34:22

Jython操作符重載

2020-06-30 08:12:32

VMwareKVMDocker

2009-08-19 17:13:15

C# 操作符基礎知識
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩亚 | 精品国产31久久久久久 | 日韩毛片免费看 | 国产一级片免费在线观看 | 国产精品久久久久久吹潮 | 中文字幕日韩欧美 | 日本久久精 | 色秀网站| 妹子干综合 | 午夜久久久久久久久久一区二区 | 国产1页| 欧美国产日韩在线观看成人 | 中文字幕第三页 | 在线视频一区二区 | 成人在线免费网站 | 草草视频在线观看 | 精品无码久久久久久国产 | 亚洲日本乱码在线观看 | 亚洲精品国产综合区久久久久久久 | 精品在线一区二区三区 | 日韩精品在线观看一区二区三区 | 蜜桃av一区二区三区 | 精品一区二区三区在线观看 | 在线成人| 国产精品亚洲综合 | 免费视频二区 | 久久久久久久国产 | 天天干天天插 | 牛牛热在线视频 | www.啪啪.com| 二区三区av | 91人人看| 亚洲欧洲精品成人久久奇米网 | 久久久蜜桃 | 国产高清不卡 | 婷婷午夜天 | 久久午夜精品 | 国产精品一区二区三区在线 | 亚洲一区二区三区四区五区中文 | 国产精品久久久久久亚洲调教 | 91在线一区|