SUNWEN教程之----C#進階(九)

來源:互聯網
上載者:User
現在我要說的是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: {
005: public RomanNumeral(int value)
006: {
007: this.value = value;
008: }
009: static public implicit Operator RomanNumeral(int value)
010: {
011: return new RomanNumeral(value);
012: }
013: static public explicit operator int(RomanNumeral roman)
014: {
015: return roman.value;
016: }
017: static public implicit operator string(RomanNumeral roman)
018: {
019: return("Conversion not yet implemented");
020: }
021: private int value;
022: }
023:
024: class Test
025: {
026: static public void Main()
027: {
028: RomanNumeral numeral;
029:
030: numeral = 10;
031:
032: // 顯式地從numeral到int的轉換033: Console.WriteLine((int)numeral);
034:
035: // 隱示地轉換到string036: Console.WriteLine(numeral);
037:
038: // 顯示地轉換到int,然後顯示地轉換到short040: short s = (short)numeral;
041:
042: Console.WriteLine(s);
043:
044: }
045: }
這個例子子的輸出是:

10
Conversion 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: {
005: public RomanNumeral(int value) { this.value = value; }
006: static public implicit operator RomanNumeral(int value)
007: {return new RomanNumeral(value);}
008: static public implicit operator
009: RomanNumeral(BinaryNumeral binary)
010: {return new RomanNumeral((int)binary);}
011: static public explicit operator int(RomanNumeral roman)
012: {return roman.value;}
013: static public implicit operator string(RomanNumeral roman)
014: {return("Conversion not yet implemented");}
015: private int value;
016: }
017:
018: struct BinaryNumeral
019: {
020: public BinaryNumeral(int value) {this.value = value;}
021:
022: static public implicit operator BinaryNumeral(int value)
023: {return new BinaryNumeral(value);}
024: static public implicit operator string(BinaryNumeral binary)
025: {return("Conversion not yet implemented");}
026: static public explicit operator int(BinaryNumeral binary)
027: {return(binary.value);}
028:
029: private int value;
030: }
031:
032: class Test
033: {
034: static public void Main()
035: {
036: RomanNumeral roman;
037: roman = 10;
038: BinaryNumeral binary;
039: binary = (BinaryNumeral)(int)roman;
040: roman = binary;
041: Console.WriteLine((int)binary);
042: Console.WriteLine(binary);
043: }
044: }
這個例子的輸出是:

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

以上就是SUNWEN教程之----C#進階(九)的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.