自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開(kāi)發(fā) 后端
對(duì)于C#中的自增、自減操作符重載,無(wú)論前綴式或是后綴式,都統(tǒng)統(tǒng)只需要一個(gè)實(shí)現(xiàn)。本文主要介紹的是C#中的自增自減操作符的重載,希望對(duì)你有幫助,一起來(lái)看。

C#中,重載自增、自減操作符的語(yǔ)法并沒(méi)有什么特殊之處,如下:

  1. public static SomeType operator ++(SomeType some)  
  2. {   
  3. //具體實(shí)現(xiàn)  

對(duì)于C#中的自增、自減操作符重載,無(wú)論前綴式或是后綴式,都統(tǒng)統(tǒng)只需要一個(gè)實(shí)現(xiàn)。也就是說(shuō)無(wú)論我是這樣:someType++,還是這樣:++someType使用SomeType類(lèi)型的自增重載,上述代碼中的實(shí)現(xiàn)都完全足夠完成任務(wù)。但是,前綴式++與后綴式++的行為畢竟不同,為什么他們只需要一份同樣的實(shí)現(xiàn)就可以達(dá)到我們需要的目的了呢?

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

  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. }} 

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

當(dāng)我們使用SomeType的前綴自增重載時(shí):

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

如我們所預(yù)料的,操作符重載的方法體會(huì)被執(zhí)行。而且instance也確實(shí)會(huì)按照理想的方式自增。我們?cè)賮?lái)看后綴自增操作:

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

不嚴(yán)謹(jǐn)?shù)乃季S讓我們很容易認(rèn)為,現(xiàn)在instance1的Number應(yīng)該是2,而instance2的Number應(yīng)該是1。但是,事不如人愿,實(shí)際上現(xiàn)在的instance1和instance2的Number都是2!

這到底是為什么呢?

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

也就是說(shuō),如果SomeType是引用類(lèi)型,則在執(zhí)行完++instance語(yǔ)句之后,instatnce會(huì)指向那個(gè)被自增重載操作符方法所返回的對(duì)象實(shí)例。而如果SomeType是值類(lèi)型,那么instance會(huì)被按照C#值類(lèi)型的標(biāo)準(zhǔn)賦值方式被重載操作符方法返回的值類(lèi)型賦值,也就是逐字段賦值。

當(dāng)我們使用前綴式時(shí),這一切都工作的很好。但是當(dāng)我們使用后綴式時(shí),問(wèn)題就來(lái)了。在上面的使用后綴自增的例子里,首先執(zhí)行了instance1的自增操作,不過(guò)接下來(lái),實(shí)際上是使用了instance1在執(zhí)行自增操作前的一個(gè)副本(對(duì)于引用類(lèi)型,使用引用的副本;對(duì)于值類(lèi)型,使用整個(gè)結(jié)構(gòu)的副本)來(lái)對(duì)instance2賦值的。

因?yàn)槲覀冊(cè)赟omeType的自增重載的實(shí)現(xiàn)中,直接對(duì)操作數(shù)進(jìn)行了修改,并且返回了原操作數(shù)。所以這樣一來(lái),現(xiàn)在instance1和instance2現(xiàn)在指向的都是原操作數(shù)的實(shí)例,他們有同樣的Number也就不足為怪了。

另一個(gè)SomeType的自增重載版本是這樣的:

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

這個(gè)版本的實(shí)現(xiàn)遵循了“不應(yīng)該在操作符重載中修改操作數(shù)”的原則。如果使用了這個(gè)版本的自增重載,在上述后綴式自增的例子中,會(huì)和我們預(yù)期的一樣:instance1的Number是2,而instance1的Number是1。

我想,在很多情況下(特別是當(dāng)SomeType是值類(lèi)型時(shí)),這會(huì)是您希望得到的結(jié)果,也同樣是您代碼的消費(fèi)者所預(yù)期的結(jié)果。

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

注意:自增重載方法的返回值是用來(lái)賦值給調(diào)用該重載方法的操作數(shù)的?。ㄈ绻蠧++的背景,這一點(diǎn)可能不太容易接受)

【編輯推薦】

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

2009-08-18 17:55:20

C#操作符重載

2021-07-30 07:28:16

偽類(lèi)偽元素CSS

2017-11-24 11:10:38

區(qū)塊鏈礦工分叉

2018-05-08 08:46:47

Linux內(nèi)存釋放

2009-08-18 18:06:54

C#操作符重載

2021-11-01 15:35:31

C++自增自減

2009-08-18 17:42:12

C#操作符重載

2018-01-25 16:07:41

匿名函數(shù)自執(zhí)行

2009-08-18 17:20:17

C#操作符重載

2009-08-18 17:34:25

C#操作符重載應(yīng)用

2009-08-19 17:26:28

C# 操作符

2009-08-21 09:30:05

is和as操作符

2023-12-26 01:09:28

MySQL存儲(chǔ)釋放鎖

2020-07-09 09:56:48

Python語(yǔ)言開(kāi)發(fā)

2009-08-19 17:20:22

C# 操作符

2010-02-05 10:30:02

C++操作符重載

2009-07-14 18:34:22

Jython操作符重載

2021-07-07 05:37:57

郵件安全網(wǎng)絡(luò)攻擊數(shù)據(jù)泄露

2010-02-03 10:23:47

C++操作符重載

2009-08-19 17:38:17

C# 操作符分類(lèi)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)