来源:www.cncfan.com | 2006-1-12 | (有1691人读过)
文章搜索
关键字 标题 内容
文章目录 DHTML [12] CSS [80] Dreamweaver [138] HTML基础 [84] 待审核区 [3728] Frontpage [53] JS基础 [56] JS特效 [127] 图片相关 [39] FLASH [161] PHOTOSHOP [174] FireWork [175] ASP基础 [646] NET基础 [274] PHP基础 [286] STRUTS [53] JSP配置 [136] applet [36] Servlet [74] JSP基础 [473] EJB [133] JAVA基础 [1920] PostgreSQL [105] SQL SERVER [106] ORACLE [90] SQL基础 [220] MYSQL [91] ECLIPSE [18] JBuilder [44] VC [8] XML基础 [118] C#基础 [142] WWW服务 [81] FTP服务 [26] UNIX [125] Windows 2000 [39] windows 2003 [52] Windows xp [136] Solaris [98] FreeBSD [71] *NIX [345] windows [85] Redhat [74] sun [100] CGI基础 [31] PERL基础 [45] 搜索引擎 [41] 网站排名 [33] 短信息 [94] 其他文章 [43] 热点文章链接 《展现 C#》(一)前言 [1] 用C#快速往Excel写数据 [1] 解读 C# 中的正则表达式 [1] C#中如何插入照片到Excel [1] c#中结构与类的区别 [1] 初学进阶:用C#创建可拖动窗体 [1] 教你在C#中如何读写INI文件 [1] C#进阶教程(一) [1] C#进阶教程(二) [1] C#进阶教程(三) [1] C#进阶教程(四) [1] C#进阶教程(五) [1] C#进阶教程(六) [1] C#进阶教程(七) [1] C#进阶教程(八) [1] 相关文章链接 解剖恶意网站代码:弹出IE页面 [2004-12-15] Flash 与三维全景结合 [2004-12-15] PNG图片遮罩问题 [2004-12-15] 浅谈动画背景的制作 [2004-12-15] 首页--文章分类--C SHARPE--C#基础 SUNWEN教程之----C#进阶(九) 作者: 文章来源: 访问次数: 加入时间:2004-12-15 大家好,我是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: // UserConversionsconversion.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: // UserConversionsstructconversion.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
|