C#进阶(九)

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

猜你喜欢

转载自www.cnblogs.com/bbc2020/p/12468115.html