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的隐示的转换到String。如果是(String)a,就叫做显示。所以,显/隐之差就在于是否表现出来。大家现在肯定还是一头雾水,等到明天我把例子写出来再分析一下就清楚了,要熄灯了,我先走一步了!
喔~~~~~终于起来了,五月五日8:45。下面是一个例子,在这个例子中,一个叫做罗马数字的类型被声明,然后对他实施了好几次转换。
000:// UserConversions \ conversion.cs
001:使用系统;
002:
003:struct RomanNumeral
004:{
005:public RomanNumeral(int value)
006:{
007:this.value = value;
008:}
009:静态公共隐式运算符RomanNumeral(int value)
010:{
011:返回新的RomanNumeral(value);
012:}
013:静态公共显式运算符int(RomanNumeral roman)
014:{
015:return roman.value;
016:}
017:静态公共隐式运算符字符串(罗马数字罗马)
018:{
019:return(“转换尚未实现”);
020:}
021:私有int值;
022:}
023:
024:类测试
025:{
026:静态public void Main()
027:{
028:罗马数字;
029:
030:数字= 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
尚未实现的转换
10
注意009和013的operator操作符,它是一个转换操作符。static public visible operator int(RomanNumeral roman),记住这样的形式,它就代表了一个转换。再看第033行,因为在前面int这个转换被声明为explicit,即显示地,所以,在使用这个转换时,必须用括号。
下面再提出一个例子,这个例子说明了两个结构,RomanNumeral和BinaryNumeral,然后在它们之间进行转换。
000:// UserConversions \ structconversion.cs
001:使用系统;
002:
003:struct RomanNumeral
004:{
005:public RomanNumeral(int value){this.value = value; }
006:静态公共隐式运算符RomanNumeral(int value)
007:{返回新的RomanNumeral(value);}
008:静态公共隐式运算符
009:RomanNumeral(BinaryNumeral二进制)
010:{返回新的RomanNumeral((int)binary);}
011:静态公共隐式运算符int(RomanNumeral roman)
012:{return roman.value;}
013:静态公共隐式运算符string(RomanNumeral roman)
014:{return(“尚未实现转换”);}
015:私有int值;
016:}
017:
018:struct BinaryNumeral
019:{
020:public BinaryNumeral(int value){this.value = value;}
021:
022:静态公共隐式运算符BinaryNumeral(int value)
023:{返回新的BinaryNumeral(value) ;}
024:静态公共隐式运算符字符串(BinaryNumeral二进制)
025:{return(“尚未转换”);}
026 :静态公共隐式运算符int
(BinaryNumeral 二进制)027:{return(binary.value);}
028 :
029:私有int值;
030:}
031:
032:类测试
033:{
034:静态public void Main()
035:{
036:罗马罗马数字;
037:罗马= 10;
038:BinaryNumeral二进制;
039:二进制=(BinaryNumeral)(int)罗马;
040:罗马=二进制;
041:Console.WriteLine((int)binary);
042:Console.WriteLine(binary);
043:}
044:}
这个例子的输出是:
10
转换尚未实施
注意,第039行并没有直接由RomanNumeral转换成BinaryNumeral,因为没有直接的转换提供。所以先把RomanNumeral转换成int,再转成BinaryNumeral。至少我这么认为),如果上面的例子理解了,下面的就好了。
OK,又完了一段,学了这么多,大家有什么感觉呢,欢迎和我交流,北京代孕咨询电13802269370 代孕微13802269370