C#进阶(九)

C#进阶(九)


作者: SUNWEN  &;nbsp来自:网络


                大家好,我是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,又完了一节,学了这么多,大家有什么感觉呢,欢迎和我交流,mrfat@china.com
    (2005-7-16:02:34)
 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 警告:持续变种木马正在发起农历新年攻势!
 您可能对 [C#] 的这些文章也感兴趣:
用于统计函数执行时间的类
Visual C#2005中使用正则表达式
C#低级Windows API钩子拦截键盘输入
用C#实现基于TCP协议的网络通讯
防止winform假死新技术,visual studio 2005自带的控件
理解C# 3.0新特性之Extension方法浅议
关于C#中委托的学习
Visual C# .Net环境中编程实现浮动工具栏
C#中提供的VB不支持的新特性
C#2.0之partial
c#下的javascript写成有用的类
C# 网络资源