当前位置:首页 > 网络编程 > WEB编程 > ASP.net > SUNWEN教程之----C#进阶(九)

SUNWEN教程之----C#进阶(九)

点击次数:23 次 发布日期:2008-11-27 00:13:48 作者:源代码网
源代码网推荐 大家好,我是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: // UserConversionsconversion.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: // UserConversionsstructconversion.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,又完了一节,学了这么多,大家有什么感觉呢,欢迎和我交流,mrfat@china.com


源代码网推荐
源代码网供稿.

网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华