C#进阶教程(九)

2016-02-19 17:10 5 1 收藏

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

【 tulaoshi.com - 编程语言 】

  现在我要说的是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,就叫做显示.所以,显/隐之差就在于是否表现出来.大家现在肯定还是一头雾水,等到明天我把例子写出来再分析一下就清楚了,要熄灯了,我先走一步了!

(本文来源于图老师网站,更多请访问http://www.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: }

  这个例子子的输出是:

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

  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

来源:http://www.tulaoshi.com/n/20160219/1614423.html

延伸阅读
写在前面的话 在写这些文章之前,我对C#一无所知.只从前辈那里听说了一些,说他很像JAVA.因为我这段时间一直在看JAVA,结果什么明堂没看出来(只能怪我太笨:),其实我想还是没有实践的机会),所以就很想换换口味.其实很早就听说了C#,想看一看这个东东,只是上M$的网站一看,.NET的东东要一百多兆呢!看了就怕,何况全部下载下来,要费我一整张...
大家好,我是SUNWEN.今天下午得知,晚上要去当"更夫".呵呵,我们这个学校很是奇怪,要叫我们轮流去通宵巡逻,从晚上10:30到早上6:00.我有一个物理系的朋友,上次在田家炳楼门前找了一个宣传板,垫在下面就睡了一觉,听了笑死我了!哈哈! 现在我想说的是C#中的容器.这是一个非常重要的话题,因为不管你写什么样的程序,你都不能不与容...
终于又到一个白天了,起床,伸个懒腰,又坐到了电脑前面.今天我要向大家讲的是C#的数组(Arrays).C#中的数组和其它一些优秀的语言一样,也是从0开始计的,这从我们以前的例子里可以看出来,也就是说,一个数组的第一个元素是a[0],而不是像VB的a(1).虽然是这样,但是你还是要注意一些区别. 在声明一个数组的时候,方括号必须跟在类型后面,而不能跟在变量...
大家好,我是武汉华师的SUNWEN.我回来了.现在是五月二号下午3:20.我刚从电脑城回来,买了一版D版的MP3.呜,湖北的同学都回去了,尤其是武汉的,跑得特别快,真是可恨.剩下我一个孤零零的福建佬,没事做,只好一个人听音乐,真是惨!幸好这音乐还比较好听,呵呵,其实SUNWEN一点音乐细胞也没有. 言归正传,我现在要说的是库(libraries),和大家一起学习如何用...
大家好,我是武汉华师的SUNWEN.现在是五月二号晚上19:27,由于闲着没事干,所有又写起来了.昨天照了十几张相,待会可以去取了,不知照片中的我是不是很帅,呵呵!现在我耳边正听着2000欧洲杯的曲子,所以比较激动.唉,身为我们院2000级足球队长的我,已经很久没有踢球了! 现在我要说的是C#中的版本处理.其实这是任何一个软件必须要考虑的问题.每个软件都...

经验教程

888

收藏

29
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部