C#进阶教程(九)

原创 2007年09月29日 08:47:00
C#中的用户自定义转换(User-Defined Conversions)
  现在我要说的是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: // UserConversions/conversion.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: // UserConversions/structconversion.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.其余的东西跟上面的例子是一样的(至少我这么认为),如果上面的例子理解了,下面的就好了.  

c#如何进阶?

1.关于源码,电脑格式化了很多次,源码基本没了。其实前几个小软件核心代码很少的,也没用到多少算法和数据结构,我个人数据结构和算法一直很菜,基本不用复杂的= = …就是调用了一下C# 的一些API,访问...
  • Janet_1994
  • Janet_1994
  • 2017年02月22日 21:42
  • 324

sql语句进阶教程(学习sql这一篇就够了)

转载自:http://blog.csdn.net/u011001084/article/details/51318434 最近从图书馆借了本介绍SQL的书,打算复习一下基本语法,记录一下笔记,整...
  • zsc2014030403015
  • zsc2014030403015
  • 2016年05月04日 23:07
  • 7132

Java进阶教程(一)关键字

Java进阶教程(一)关键字 synchronized:当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 instanceof:在运行时指出对象是否是特定类的...
  • CanvaChen
  • CanvaChen
  • 2017年04月09日 13:56
  • 1085

C++高级进阶 第一季:const 详解

零、文章来由打算将基础知识在看书的同时系统的整理一下,方便大家也方便自己。整理的知识尽量参照书本知识,比网上获取的资料有更高的可信度。一、从 文字常量和常变量 开始补充:const并没有想象中的那么简...
  • Scythe666
  • Scythe666
  • 2016年03月05日 10:11
  • 1471

sql语句进阶教程(学习sql这一篇就够了)

最近从图书馆借了本介绍SQL的书,打算复习一下基本语法,记录一下笔记,整理一下思路,以备日后复习之用。 PS:本文适用SQL Server2008语法。 一、关系型数据库和SQL ...
  • u011001084
  • u011001084
  • 2016年05月04日 21:47
  • 2479

MySQL的进阶实战篇

http://blog.csdn.net/javazejian/article/details/69857949  出自【zejian的博客】 关联文章: MySQL的初次见...
  • chaoluo001
  • chaoluo001
  • 2017年04月25日 09:17
  • 1761

jQuery学习进阶篇

JQuery选择器 学习JQuery选择器是如何准确地选取你所希望应用效果的元素。JQuery元素选择器和属性选择器允许你通过标签名、属性名或内容对HTML元素进行选择。选择器允许你对HTML元素或...
  • chongshangyunxiao321
  • chongshangyunxiao321
  • 2016年04月14日 16:05
  • 1902

斌哥的 Docker 进阶指南

过去的一年中,关于 Docker 的话题从未断过,而如今,从尝试 Docker 到最终决定使用 Docker 的转化率依然在逐步升高,关于 Docker 的讨论更是有增无减。另一方面,大家的注意力也渐...
  • wangpeng198688
  • wangpeng198688
  • 2016年04月29日 11:09
  • 1932

85篇技术好文助你Android进阶

从去年11月份开始,我开始写个人博客,到现在恰好一年时间了,这一年中,通过周末和空闲时间陆续原创了40余篇技术博客。博客源于自己的一些项目经验总结和对新技术的学习总结。通过博客的总结和沉淀,在自己成长...
  • u012426327
  • u012426327
  • 2017年11月29日 14:43
  • 169

C# 学习教程九

 C#集合类 集合(collection)提供了一种结构化组织任意对象的方式,而且我们早就知道集合在日常编程工作中的重要性。.NET类库提供了丰富的集合数据类型,其种类之繁多甚至使许多...
  • zhouzhiwengang
  • zhouzhiwengang
  • 2014年01月12日 18:50
  • 414
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#进阶教程(九)
举报原因:
原因补充:

(最多只允许输入30个字)