第四课:类型转换
类型之间的转换是经常发生的。比如,你需要去确定一个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块包装一个狭窄转换或使用TryCast,TryParse同时检验返回值。
什么是装箱和拆箱?
装箱是把一个值类型转换为一个引用类型,并且拆箱是把一个引用类型转换为一个值类型。以下的例子是把一个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 关键字会使转换丢掉精确度 。
例如,以下的结构定义了允许你在TypeA和int直接相互转换:
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();
}
}
以上的类型也override了ToString方法去做字符串转换而不用装箱。现在你能把一个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个方法的声明,包括为每个基本类型的GetTypeCode,ChangeType和ToType方法。你不必实现每个方法,并且其中的一些可能也是无效的—比如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());
相关推荐
- **第4章:使用LINQ to Entities进行查询** - 更深入地探讨了LINQ to Entities,这是一种专门针对Entity Framework优化的LINQ查询方式。 - 包括了更复杂的查询表达式和性能优化技巧。 - **第5章:域模型映射** -...
`Converter` 接口局限性在于它只能处理两个固定类型的转换,而 `GenericConverter` 提供了 `ConvertiblePairs` 类来定义一组可以相互转换的类型对,从而支持更复杂的一对多或多对一转换需求。`GenericConverter` 还...
#### 第一章:介绍ADO.NET 4.0实体框架 **知识点概述:** 本章节主要介绍了ADO.NET 4.0实体框架的基本概念及其在.NET编程中的重要性。ADO.NET 4.0实体框架是一种用于与数据库进行交互的对象模型和工具集,它提供了...
**第4章:在ASP.NET MVC中使用Entity Framework** - **集成EF与MVC**:讲解如何将Entity Framework集成到ASP.NET MVC应用中。 - **控制器与视图**:介绍如何编写控制器处理业务逻辑,并将数据传递给视图层展示。 - *...
.NET Framework 2.0 是微软开发的一个重要框架,它为开发者提供了一个托管的代码执行环境,使得编写和运行跨平台的应用程序变得更加简单。这个框架包含了众多的组件和服务,旨在提高开发效率、安全性以及应用程序的...
.NET Framework是微软开发的一个软件框架,它为开发者提供了一个一致的编程环境,使得构建、部署和运行基于Windows的应用程序变得更加简单。C#是.NET Framework的主要编程语言,它结合了面向对象编程的特性,如封装...
.NET Framework是微软开发的一个全面的开发平台,它包含了运行应用程序所需的各种组件和服务。这个平台的主要语言之一是C#,一种面向对象的编程语言,广泛应用于Windows应用开发、Web服务和移动应用等领域。以下是对...
#### 第一章:认识ADO.NET Entity Framework **1.1 实体关系模型:编程面向模型而非数据库** - **定义与作用**:实体关系模型是EF的核心之一,它允许开发者基于模型进行编程,而不是直接针对数据库表和列。这种方式...
- **第1章**:数据访问重载:Entity Framework 3 - **1.1** 开始使用数据访问 - 讨论了数据访问的基本概念和发展历程。 - **1.2** 使用数据库类似结构开发应用程序 - 介绍了使用数据集和数据阅读器作为数据容器...
第十二章的文档可能包含了一些关于.NET Framework和C#的高级主题,如Asynchronous Programming Model (async/await)、Generics、Entity Framework(ORM框架)、WCF(Windows Communication Foundation,服务端开发)...
#### 一、第一章 开始使用实体框架 **1-1 实体框架简述** - **概念**:实体框架(Entity Framework,简称EF)是一种由Microsoft开发的对象-关系映射(ORM)框架,它允许开发者将应用程序中的对象模型与数据库中的...
- **第4章:理解视图** - **视图引擎**:Razor是默认的视图引擎,支持强大的模板语法。 - **布局页**:用于统一页面的外观设计。 - **部分视图**:可重用的小型视图组件。 - **第5章:理解模型** - **数据模型*...
**精通LINQ数据访问技术第一章** 在.NET框架中,Language Integrated Query(LINQ)是一项强大的技术,它将查询表达式直接整合到C#和Visual Basic等编程语言中,极大地简化了数据访问操作。本章主要介绍了LINQ的...
通常,全名的第一部分(即最右边的点之前的部分)代表命名空间名称;最后一部分(即最右边的点之后的部分)则代表类型名称。 **10. .NET Framework类库(FCL)如何组织其众多的类型?** - **知识点解析**:为了便于...
《激光SLAM理论与实践第一章》是关于机器人定位与建图技术的重要篇章,主要探讨了在现实环境中如何利用激光传感器进行自主导航和环境理解。在这个章节中,我们首先会接触到一个核心概念——“变换”,它是SLAM算法中...
#### 第4章:类型基础 - **类型系统**:深入了解CLR中的类型系统,包括基本数据类型和引用类型的区别。 - **类型层次结构**:分析.NET Framework中的类型层次结构,理解继承和多态性。 - **泛型类型**:介绍泛型...
### 第一章:简介 #### 优势 .NET Micro Framework具有以下优势: - **可靠性**:.NET平台以其强大的稳定性和安全性著称,这对于嵌入式系统尤为重要。 - **高效性**:.NETMF针对资源有限的设备进行了优化,能够在...