首页 > 开发 > 综合 > 正文

SUNWEN教程之----C#进阶9

2024-07-21 02:20:16
字体:
来源:转载
供稿:网友
sunwen教程之----c#进阶
(九)
[email protected]  
大家好,我是sunwen,现在是五月四号23:15,再过十五分钟就要熄灯了.所以要抓紧时间,先开个头,明天继续.

现在我要说的是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.其余的东西跟上面的例子是一样的(至少我这么认为),如果上面的例子理解了,下面的就好了.

ok,又完了一节,学了这么多,大家有什么感觉呢,欢迎和我交流,[email protected]

下一页


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表