C#进阶教程(九)

597188274

597188274

2016-02-19 17:10

今天图老师小编要跟大家分享C#进阶教程(九),精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

  现在我要说的是C#中的用户自定义转换(User-Defined Conversions),其中用到了前面说的struct的知识,就是结构呀,忘了吗?好,没忘就好.从我们以下的课程我们可以看到结构的用处(刚才我还在想它有什么用,呵呵).用class声明的是一个类,而用struct声明的可以看作是一个类型,对,就是像C#自带的int,short,long那样的类型了.

  C#中可以允许我们对结构(struct)和类(class)进行转换,所以我们可以在其中定义一些转换.但是,C#规定,所有的转换声明都必须在显示(explicit)和隐示(implicit)中选择一个.比方说,我们用这个语句的时候

  int a=10;

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  System.Console.println(a):

  就用到了int的隐示的转换toString.如果是(String)a,就叫做显示.所以,显/隐之差就在于是否表现出来.大家现在肯定还是一头雾水,等到明天我把例子写出来再分析一下就清楚了,要熄灯了,我先走一步了!

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  下面给出例子,在这个例子中,一个名为RomanNumeral的类型被声明,然后对他实施了好几种转换.

  

000: // UserConversionsconversion.cs001: using System;002:003: struct RomanNumeral004: {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 Test025: {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.cs001: using System;002:003: struct RomanNumeral004: {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 operator009: 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 BinaryNumeral019: {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 Test033: {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

展开更多 50%)
分享

猜你喜欢

C#进阶教程(九)

编程语言 网络编程
C#进阶教程(九)

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

编程语言 网络编程
SUNWEN教程之----C#进阶(九)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

C#进阶教程(四)

编程语言 网络编程
C#进阶教程(四)

C#进阶教程(三)

编程语言 网络编程
C#进阶教程(三)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

C#进阶教程(十一)

编程语言 网络编程
C#进阶教程(十一)

C#进阶教程(八)

编程语言 网络编程
C#进阶教程(八)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

CRectTracker C# 实现橡皮区矩形

CRectTracker C# 实现橡皮区矩形

用js+flash实现网页中复制数据功能

用js+flash实现网页中复制数据功能
下拉加载更多内容 ↓