C 高階教程(九)

2021-04-13 11:31:19 字數 2581 閱讀 9546

c#中的使用者自定義轉換(user-defined conversions)

現在我要說的是c#中的使用者自定義轉換(user-defined 

conversions),其中用到了前面說的struct的知識,就是結構呀,忘了嗎?好,沒忘就好.從我們以下的課程我們可以看到結構的用處(剛才我還在想它有什麼用,呵呵).用class宣告的是乙個類,而用struct宣告的可以看作是乙個型別,對,就是像c#自帶的int,short,long那樣的型別了.

c#中可以允許我們對結構(struct)和類(class)進行轉換,所以我們可以在其中定義一些轉換.但是,c#規定,所有的轉換宣告都必須在顯示(explicit)和隱示(implicit)中選擇乙個.比方說,我們用這個語句的時候

int a=10;

system.console.println(a):

就用到了int的隱示的轉換tostring.如果是(string)a,就叫做顯示.所以,顯/隱之差就在於是否表現出來.大家現在肯定還是一頭霧水,等到明天我把例子寫出來再分析一下就清楚了,要熄燈了,我先走一步了!

喔~~~~~終於起來了,五月五日8:45.下面給出例子,在這個例子中,乙個名為romannumeral的型別被宣告,然後對他實施了好幾種轉換.

000: // userconversions/conversion.cs

001: using system;

002: 

003: struct romannumeral

004:

009: static public implicit operator romannumeral(int value) 

010:

013: static public explicit operator int(romannumeral roman)

014:

017: static public implicit operator string(romannumeral roman)

018:

021: private int value;

022: }

023: 

024: class test

025:

045: }

這個例子子的輸出是:

10conversion not yet implemented

10注意009和013的operator操作符,它是乙個轉換操作符.

static public explicit operator int(romannumeral roman),記住這樣的形式,它就代表了乙個轉換.再看第033行,因為在前面int這個轉換被宣告成了explicit,即顯示地,所以,在使用這個轉換時,必須用括號.

下面再給出乙個例子,這個例子宣告了兩個結構,romannumeral和binarynumeral,然後在它們之間進行轉換.

000: // userconversions/structconversion.cs

001: using system;

002: 

003: struct romannumeral

004:

006: static public implicit operator romannumeral(int value)

007:

008: static public implicit operator

009: romannumeral(binarynumeral binary)

010:

011: static public explicit operator int(romannumeral roman)

012:

013: static public implicit operator string(romannumeral roman) 

014:

015: private int value;

016: }

017: 

018: struct binarynumeral

019:

021: 

022: static public implicit operator binarynumeral(int value)

023:

024: static public implicit operator string(binarynumeral binary)

025:  

026: static public explicit operator int(binarynumeral binary)

027:

028: 

029: private int value;

030: }

031: 

032: class test

033:

044: }

這個例子的輸出是:

10conversion not yet implemented

注意,第039行並沒有直接由romannumeral轉化成binarynumeral,因為沒有直接的轉換提供.所以先把romannumeral轉換成int,再轉成binarynumeral.其餘的東西跟上面的例子是一樣的(至少我這麼認為),如果上面的例子理解了,下面的就好了.  

菜鳥教程C 高階教程

c 特性 attribute net框架提供了三種預定義特性 attributeusage conditional obsolete 預定義特性attributeusage 預定義特性attributeusage描述了如何使用乙個自定義特性類,它規定了特性可應用到的專案的型別。attributeus...

C 高階教程(七)

c 中的結構 struct 我要說的是c 中的,注意,我在這裡說的結構不是指的c 的語言結構.這裡所說的是一種與類 class 相對的東西,下面我就與類相對比,來說一說這個struct.下面的這個例子講述了如何建立乙個具有屬性,方法和乙個欄位的結構.並講述如何使用他.000 structs stru...

C 高階教程 特性

特性 attribute 是用於在執行時傳遞程式中各種元素 比如類 方法 結構 列舉 元件等 的行為資訊的宣告性標籤。您可以通過使用特性向程式新增宣告性資訊。乙個宣告性標籤是通過放置在它所應用的元素前面的方括號 來描述的。特性 attribute 用於新增元資料,如編譯器指令和注釋 描述 方法 類等...