C#进阶教程(九)

原创 2007年09月29日 08:47:00
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: {
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.其余的东西跟上面的例子是一样的(至少我这么认为),如果上面的例子理解了,下面的就好了.  

相关文章推荐

C#基础教程-委托进阶,将方法绑定到委托

将方法绑定到委托   看到这里,是不是有那么点如梦初醒的感觉?于是,你是不是在想:在上面的例子中,我不一定要直接在GreetPeople()方法中给 name参数赋值,我可以像这样使用变量: ...
  • neso520
  • neso520
  • 2011年08月05日 14:54
  • 389

Android高手进阶教程(九)之----Android Handler的使用!

大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title. 首先我们看一下习惯了Java编程的人,在不知道Hand...

Android高手进阶教程(九)之----Android Handler的使用!!! http://weizhulin.blog.51cto.com/1556324/323922

家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title. 首先我们看一下习惯了Java编程的人,在不知道Handl...
  • Moonant
  • Moonant
  • 2013年08月23日 21:30
  • 928

Android高手进阶教程(九)之----Android Handler的使用!

大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title. 首先我们看一下习惯了Java编程的人,在不知道Hand...

Android高手进阶教程(九)----Android Handler的使用!!!

大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title.   首先我们看一下习惯了Java编程的人,在不知道H...

Android高手进阶教程(九)之----Android Handler的使用!!!

大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title.首先我们看一下习惯了Java编程的人,在不知道Handle...

C#入门与进阶——微软中国(PPT)

  • 2007年04月20日 20:29
  • 943KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#进阶教程(九)
举报原因:
原因补充:

(最多只允许输入30个字)