`
macrabbit
  • 浏览: 230463 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

第一章 FRAMEWORK 基本原理 第四课:类型转换

阅读更多

第四课:类型转换

类型之间的转换是经常发生的。比如,你需要去确定一个Integer是否比一个Double大或小。你需要把一个Double 型的数据传入一个以Integer 做参数的方法中。或你可能需要以文本的方式显示数据。

 

上完此课你将会知道:

 类型之间的转换.

 解释什么是装箱及为什么它应被避免.

 实现转换操作符

C#中的转换

C# 禁止丧失精确度的隐形转换。如果目标类型能够容纳所有源类型可能的数据,那么C#允许隐性转换。这被称作一个扩展转换,如下显示:

int i = 1;

double d = 1.0001;

d = i; // Conversion allowed.

如果源类型的范围或精确度超越目标类型,这个操作被称为收缩转换,一般要求显示转换。

1-7 列出执行显示转换的方法:

System Type                 C#                         Converts

System.Convert                             实现了System.IConvertible 接口的类型

                 (type)cast operator 定义了转换操作符的类型之间

 

type.ToString,

type.Parse                               在字符串与基类型相互转换,如果转换不成功就抛异常

 

type.TryParse,                            

type.TryParseExact                              字符串转换为其它基类型,如果转化不成功就返回false

 

 

TryParse, TryParseExact, and TryCast 是在NET 2.0的新方法以前的版本中,你必须用parsing conversion 去转换,然后转换失败后还有捕捉异常。如果源类型超过了目标类型的范围或两种类型之间的转换并没有定义,狭窄转换将会失败,所以你应当使用Try块包装一个狭窄转换或使用TryCastTryParse同时检验返回值。

什么是装箱和拆箱?

装箱是把一个值类型转换为一个引用类型,并且拆箱是把一个引用类型转换为一个值类型。以下的例子是把一个Integer类型(值类型)转换为一个Object类型(引用类型)。

int i = 123;

object o = (object) i;

如果你要把一个引用的对象付给一个值类型,拆箱就会发生。以下的例子展示了拆箱:

object o = 123;

int i = (int) o;

装箱和拆箱会引发资源的消耗,所以当编写重复任务的时候,你应当避免装拆箱。如,当你调用继承的结构的方法,同时这个方法是结构继承的System.Object中的虚方法,如ToString。以下的条款是去避免不必的装箱:

 实现多个特定类型版本的方法(overloads),使它能够接受不同的值类型。创建overloaded方法比接受一个Object 变量的方法要好。

 只要有可能不用Object 参数,就不要用,用泛型就行了。

 当定义结构的时候要Override ToString, Equals, and GetHash 虚成员 

如何实现自定义类型的转换

你能用几种方法去定义你自己创建的类型的转换。你选择哪种方法依赖于你想要转换的类型。

 Define conversion operators to simplify narrowing and widening conversions

between numeric types.

定义转换操作符(operator)去简化数字类型之间的狭窄和扩展转换。

 Override ToString 方法去提供转换到字符串的方法,并且override Parse 方法去把字符串转换为其它类型。

 实现接口System.IConvertible 使能通过System.Convert 去做类型转换。

 Implement a TypeConverter class to enable design-time conversion for use in the

Visual Studio Properties window. Design-time conversion is outside the scope of

the exam and the TypeConverter class is not covered in this book.

要想看更多的关于design-time conversion, 请看 Extending Design-Time Support

http://msdn2.microsoft.com/en-us/library/37899azc(en-US,VS.80).aspx.

定义类型转换操作符允许你直接地从一个值类型转化为一个自定义类型。使用implicit关键字会使转换不丢掉精确度;使用 explicit 关键字会使转换丢掉精确度 

例如,以下的结构定义了允许你在TypeAint直接相互转换:

struct TypeA

{

public int Value;

// Allows implicit conversion from an integer.

public static implicit operator TypeA(int arg)

{

TypeA res = new TypeA();

res.Value = arg;

return res;

}

// Allows explicit conversion to an integer

public static explicit operator int(TypeA arg)

{

return arg.Value;

}

// Provides string conversion (avoids boxing).

public override string ToString()

{

return this.Value.ToString();

}

}

以上的类型也overrideToString方法去做字符串转换而不用装箱。现在你能把一个integer直接转换为这个struct类型,如下所示:

TypeA a; int i;

// Widening conversion is OK implicit.

a = 42; // Rather than a.Value = 42

// Narrowing conversion must be explicit.

i = (int)a; // Rather than i = a.Value

Console.WriteLine("a = {0}, i = {0}", a.ToString(), i.ToString());

 

为了实现System.IConvertible接口,加入IConvertible接口到类型定义中。然后使用Visual Studio去自动地实现这个接口。Visual Studio会插入17个方法的声明,包括为每个基本类型的GetTypeCodeChangeTypeToType方法。你不必实现每个方法,并且其中的一些可能也是无效的比如ToDateTime方法。对于无效的方法,简单地抛出一个异常就可以了,Visual Studio会自动向你没有实现的任何转换方法的代码中加入抛出异常。在你实现了IConvertible接口后自定义类型能够使用标准的System.Convert 类去转换类型。如下:

TypeA a; bool b;

a = 42;

// Convert using ToBoolean.

b = Convert.ToBoolean(a);

Console.WriteLine("a = {0}, b = {1}", a.ToString(), b.ToString());

分享到:
评论

相关推荐

    WPF揭秘 第一章 wpf 开发

     第4章 WPF控件   第5章 尺寸缩放、定位与变换元素   第6章 使用面板做布局   第7章 构建并部署应用程序  第三部分 为专业开发人员设计的功能  第8章 资源   第9章 数据绑定   第10章 样式、...

    WPF揭秘 第四章 wpf 开发

     第4章 WPF控件   第5章 尺寸缩放、定位与变换元素   第6章 使用面板做布局   第7章 构建并部署应用程序  第三部分 为专业开发人员设计的功能  第8章 资源   第9章 数据绑定   第10章 样式、...

    WPF揭秘 第二章 wpf 开发

     第4章 WPF控件   第5章 尺寸缩放、定位与变换元素   第6章 使用面板做布局   第7章 构建并部署应用程序  第三部分 为专业开发人员设计的功能  第8章 资源   第9章 数据绑定   第10章 样式、...

    WPF揭秘 第三章 wpf 开发

     第4章 WPF控件   第5章 尺寸缩放、定位与变换元素   第6章 使用面板做布局   第7章 构建并部署应用程序  第三部分 为专业开发人员设计的功能  第8章 资源   第9章 数据绑定   第10章 样式、...

    ASPNET35开发大全第一章

    第4章 ASP.NET的网页代码模型及生命周期 4.1 ASP.NET的网页代码模型 4.1.1 创建ASP.NET网站 4.1.2 单文件页模型 4.1.3 代码隐藏页模型 4.1.4 创建ASP.NET Web Application 4.1.5 ASP.NET网站和ASP.NET应用程序的区别...

    框架设计 CLR Via C#第二版.part1.rar

     第4章 类型基础  第5章 基元、引用和值类型 第Ⅲ部分 类型的设计  第6章 类型和成员基础  第7章 常量和字段  第8章 方法:构造器、操作符、转换操作符和参数  第9章 属性  第10章 事件 第Ⅳ部分 基本类型...

    框架设计 CLR Via C#第二版.part2.rar

     第4章 类型基础  第5章 基元、引用和值类型 第Ⅲ部分 类型的设计  第6章 类型和成员基础  第7章 常量和字段  第8章 方法:构造器、操作符、转换操作符和参数  第9章 属性  第10章 事件 第Ⅳ部分 基本类型

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    第4章 类 型 基 础 4.1 所有类型都从System.Object派生 4.2 类型转换 4.2.1 使用C#的is和as操作符来转型 4.3 命名空间和程序集 4.4 运行时的相互联系 第5章 基元类型、引用类型和值类型 5.1 编程语言的基元...

    Visual C# 2008从入门到精通.pdf

    第4章 C#面向对象编程 4.1 类和对象 4.1.1 面向对象概述 4.1.2 类的基本概念 4.2 类成员 4.2.1 数据成员 4.2.2 定义方法 4.2.3 定义属性 …… 第二篇 编程基础 第5章 数组和集合 第6章 字符串和正则表达式 第7章 ...

    wpf完全教程1-4章

     第4章 WPF控件   第5章 尺寸缩放、定位与变换元素   第6章 使用面板做布局   第7章 构建并部署应用程序  第三部分 为专业开发人员设计的功能  第8章 资源   第9章 数据绑定   第10章 样式、...

    Java语言基础下载

    第一章:Java开始 1 学习目标 1 Java历史 2 Java技术概述 3 Java技术的优点 3 Java虚拟机 4 类加载器 6 Windows环境变量 8 内容总结 13 独立实践 14 第二章: 面向对象概述 15 学习目标 15 面向对象(Object Oriented...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    第4章 类 型 基 础 4.1 所有类型都从System.Object派生 4.2 类型转换 4.2.1 使用C#的is和as操作符来转型 4.3 命名空间和程序集 4.4 运行时的相互联系 第5章 基元类型、引用类型和值类型 5.1 编程语言的基元...

    CLR.via.C#.(中文第3版)(自制详细书签)

    第4章 类 型 基 础 4.1 所有类型都从System.Object派生 4.2 类型转换 4.2.1 使用C#的is和as操作符来转型 4.3 命名空间和程序集 4.4 运行时的相互联系 第5章 基元类型、引用类型和值类型 5.1 编程语言的基元...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    第4章 类 型 基 础 4.1 所有类型都从System.Object派生 4.2 类型转换 4.2.1 使用C#的is和as操作符来转型 4.3 命名空间和程序集 4.4 运行时的相互联系 第5章 基元类型、引用类型和值类型 5.1 编程语言的基元...

    深入理解Android:卷I--详细书签版

     第4章剖析了zygote和system_server进程的工作原理。本章的拓展思考部分讨论了Andorid的启动速度、虚拟机heapsize的大小调整问题以及“看门狗”的工作原理。  第5章讲解了Android源码中常用的类,如sp、wp、...

    《深度理解Android:第一卷》

    2.4.2 数据类型转换 / 22 2.4.3 JNIEnv介绍 / 24 2.4.4 通过JNIEnv操作jobject / 25 2.4.5 jstring介绍 / 27 2.4.6 JNI类型签名介绍 / 28 2.4.7 垃圾回收 / 29 2.4.8 JNI中的异常处理 / 32 2.5 本章小结 / ...

    [ASP.NET.AJAX编程参考手册(涵盖ASP.NET.3.5及2.0)].(美)霍斯拉维.扫描版.pdf

    第4章 JavaScript面向对象编程和类型反射扩展 4.1 JavaScript函数 4.2 JavaScript类 4.3 Type 4.4 registerClass 4.5 getName 4.6 isClass 4.7 registerNamespace 4.8 isNamespace 4.9 registerInterface 4.10 ...

    Visual C# 2010程序设计教程(教程PPT+源代码)

    第4章 数组与集合 4.1 数组 4.1.1 数组的声明 4.1.2 -维数组的使用 4.1.3 多维数组的使用 4.2 集合 4.2.1 集合的定义 4.2.2 集合的使用 4.2.3 常用系统预定义的集合类 4.3 本章小结 4.4 上机练习 4.5 习题 第5章 C#...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    9.1.4 选择枚举的基本类型 157 9.2 使用结构 159 9.2.1 声明结构 161 9.2.2 理解结构和类的区别 162 9.2.3 声明结构变量 163 9.2.4 理解结构的初始化 164 9.2.5 复制结构变量 167 第9章快速参考 170 第10章 ...

    C#与.NET3.5高级程序设计(第4版) 中文1

    第4章 C#核心编程结构Ⅱ 82 4.1 方法和参数修饰符 82 4.2 成员重载 86 4.3 C#中的数组操作 88 4.4 枚举类型 93 4.5 结构类型 97 4.6 值类型和引用类型 99 4.7 值类型和引用类型:最后的细节 105 4.8...

Global site tag (gtag.js) - Google Analytics