首页 >> 民生评论

进阶教程九用户自定义转换的

民生评论  2021-08-24 13:33 字号: 大 中 小

C#中的用户自定义转换(User-Defined Conversions)

现在我要说的是C#中的用户自定义转换(User-Defined Conversions),其中用到了前面说的struct的知识,就是结构呀,忘了吗?好,没忘就好.从我们以下的课程我们可以看到结构的用处(刚才我还在想它有什么用,呵呵).用class声明的是一个类,而用struct声明的可以看作是一个类型,对,就是像C#自带的int,short,long那样的类型了.

C#中可以允许我们对结构(struct)和类(class)进行转换,所以我们可以在其中定义一些转换.但是,C#规定,所有的转换声明都必须在显示(explicit)和隐示(implicit)中选择一个.比方说,我们用这个语句的时候

int a=10;

intln(a):

就用到了int的隐示的转换toString.如果是(String)a,就叫做显示.所以,显/隐之差就在于是否表现出来.大家现在肯定还是一头雾水,等到明天我把例子写出来再分析一下就清楚了,要熄灯了,我先走一步了!

喔~~~~~终于起来了,五月五日8:45.下面给出例子,在这个例子中,一个名为RomanNumeral的类型被声明,然后对他实施了好几种转换.

000: // UserConversions\\

001: using System;

002:

003: struct RomanNumeral

004: {

005: public RomanNumeral(int value)

006: {

007: lue = 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 lue;

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: iteLine((int)numeral);

034:

035: // 隐示地转换到string036: iteLine(numeral);

037:

038: // 显示地转换到int,然后显示地转换到short040: short s = (short)numeral;

041:

042: iteLine(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,然后在它们之间进行转换.

但该数据一直是影响美元走势的重要因素。美国8月非农就业人数意外下降4千人 000: // UserConversions\\

001: using System;

002:

003: struct RomanNumeral

004: {

005: public RomanNumeral(int value) { lue = 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 lue;}

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) {lue = 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(lue);}

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: iteLine((int)binary);

042: iteLine(binary);

043: }

044: }

这个例子的输出是:

10

Conversion not yet implemented

注意,第039行并没有直接由RomanNumeral转化成BinaryNumeral,因为没有直接的转换提供.所以先把RomanNumeral转换成int,再转成BinaryNumeral.其余的东西跟上面的例子是一样的(至少我这么认为),如果上面的例子理解了,下面的就好了.

拉萨医院哪家白癜风医院好
巴中治疗白癜风哪家医院好
郑州白癜风医院在哪
推荐资讯