DotNetFramework大学题库 - 图文(6)

2019-02-21 00:30

第2章 公共语言运行库和类型

Int64 a = 0; Int32 b = 0; b = (Int32) a;

[VB.NET]

Dim a As Int64 = 100 Dim b As Int32 = 0 b = CInt(a)

2.3 公共语言规范

CTS 定义了大量且相当复杂的类型集。并非所有这些类型对所有语言都有意义。CLR 的关键目标之一是允许以一种语言创建代码,然后用另一种语言调用该代码。除非两种语言以相同的方式支持相同的类型,否则将出现问题。但是对于语言开发人员而言,要求每一种语言实现每一种 CTS 类型将是一件繁重而又累赘的事情,例如VB.NET就没有完全实现CTS中的类型。

对此难题的解决方案是一种称为公共语言规范(CLS)的折衷方案。CLS 定义了 CTS 的一个子集(很大一部分),如果语言需要其它兼容CLS的语言进行互操作,则必须遵守该规范。例如,CLS要求支持大多数CTS值类型,包括 Boolean、Byte、Char、Decimal、Int16、Int32、Int64、Single、Double等等。但是,它不要求支持UInt16、UInt32 或 UInt64。同样,CTS数组允许其下限设置为任意值,而CLS兼容的数组下限必须为0。CLS中还有多种其它限制,所有这些限制的最终目的都是:允许以基于CLR的不同语言编写的代码之间能够进行有效的互操作。

需要指出的有关CLS所定规则的重要一点是,它们只适用于类型的外部可见的那些方面。任何一种语言可在其自己的“领地”内随意行事,但是它对外部(可能是其它语言)所公开的内容则受到CLS的限制。依照跨语言可互操作性的目标,这一特点极有意义。

2.4 特殊系统类型

2.4.1 泛型

泛型是一种特殊的类型,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候才执行。通过泛型可以定义类型安全类,而不会损害类型安全、性能或工作效率。在 .NET Framework的早期版本中,集合将对象存储为System.Object类型的实例。因此,可以使用单个集合对象来存储任何类型的对象。这样做将使类型安全受到损害并导致性能开销,因为在从集合检索对象或向其添加对象时需要执行隐式和显式类型强制转换,而且在编译时无法发现强制转换可能导致的错误。.NET Framework 2.0提供泛型,可以使用它来为引用类型和值类型创建类型安全的集合。在实例化泛型集合时指定类型,这样实例化后的泛型集合只能储存指定的类型,而且不再需要类型转换。下面的代码演示了泛型集合和原来的类型集合的区别。(由于VB不是强类型语言,因此在编译时类型转化不会报错,我们也就不给出VB的代码了) [C#]

17

.NET Framework 2.0 程序设计

class Program {

static void Main(string[] args) {

//使用泛型,在编译时就能报错。

//在定义List泛型类时没有集合成员的类型。成员在实例化的时候才指定。 List list = new List(); //加入String类型的对象,编译正常 list.Add(\

//加入整型变量,编译出错 list.Add(1);

Console.WriteLine(list[0]);

//不使用泛型,在运行时才报错

//ArrayList的成员类型是Object,可以存放任何对象 ArrayList arrayList = new ArrayList(); arrayList.Add(\ //编译正常

arrayList.Add(1);

Console.WriteLine((String)arrayList[0]); //编译正常,运行出错

Console.WriteLine((String)arrayList[1]); } }

.NET Framework 2.0在System.Collections.Generic和System.Collections.ObjectMode 命名空间中提供了多个泛型集合类。使用这些类将可以取得以下所述的各种优势:

z 可重用性:可使用相同的代码对多个场景使用一个泛型类型定义,而不需要对代码进

行任何更改。例如,假设要编写代码来添加两个数。在出现泛型这个概念之前,达到此目的的最好方法是用不同的数据类型对 Sum 方法进行重载并返回值。然而,现在你可以创建一个泛型方法来添加这两个数,并用所需数据类型的值调用该方法。 z 类型安全:泛型数据类型提供更好的类型安全性,尤其是在使用集合的情况下。在

Collection类中,当添加对象时,编译器不会对正在添加的对象的类型进行检查。因此,运行时的强制转换可能失败。另一方面,可以通过使用泛型来定义要在编译时传递给集合和编译器的对象类型,以确保仅传递这些对象。这将增强类型安全性并降低发生类型强制转换错误的可能性。

z 性能:由于泛型类型降低了对变量或对象进行装箱、取消装箱和类型强制转换的需要,

因此它的性能优于普通系统类型。

以下代码示例显示了如何在VB.NET和C#中实现泛型。该代码体现了使用泛型时,在可重用性和类型安全方面取得的优势。该代码示例定义名为CommonData的泛型类,该类用于创建两个对象:一个用于存储字符串值,另一个用于存储浮点值。CommonData类通过在其构造函

18

第2章 公共语言运行库和类型

数中接受所需的类型以确保类型安全。这表明在使用CommonData类时,创建对应对象指定的类型必须与定义时相同。 [C#]

class Program {

static void Main(string[] args) {

CommonDataname = new CommonData(); name.Value = \

CommonDataversion = new CommonData(); version.Value = 2.0F;

Console.WriteLine(name.Value); Console.WriteLine(version.Value); } }

public class CommonData {

private T _data; public T Value { get {

return this._data; } set {

this._data = value; } } }

[VB.NET] Class Program

Shared Sub Main()

Dim name As New CommonData(Of String) name.Value = \

Dim version As New CommonData(Of Single) version.Value = 2.0F

Console.WriteLine(name.Value) Console.WriteLine(version.Value)

19

.NET Framework 2.0 程序设计

End Sub End Class

Class CommonData(Of T) Private _data As T

Public Property Value() As T Get

Return Me._data End Get

Set(ByVal value As T) Me._data = value End Set End Property End Class

2.4.2 Nullable 类型

作为开发人员,你会经常发现自己使用的值类型没有定义的值。例如,一个银行系统需要一个值以区分数据库中的浮点型工资字段是否已被赋值,0显然不是一个适合的值,因为它无法表示该字段的值是0还是没有被赋值。这时候我们就需要一个null值来完成这项工作。可是值类型并没有null值,如果为这个值类型变量赋关键字null,则编译器将抛出一个错误。.NET Framework 2.0提供了一个名为Nullable数据类型的新功能,可以使用它来为值类型变量赋null值。Nullable数据类型既可以存储null值又可以存储一组普通值。因此,我们可以使用Nullable类型来储存那个工资字段,当该字段还未被赋值时它储存null值,赋值后储存浮点型数据。

所有的Nullable类型都使用泛型System.Nullable结构进行实例化。这使 Nullable 类型在使用时与普通数据类型一样方便,因为大多数属性和方法都是通过System.Nullable结构实现的。此结构结合了基础类型的值与Boolean null指示器。

下面的代码演示了如何使用VB.NET和C# 声明Nullable类型。该代码示例定义了一个由成员字段组成的Employee类,用于存储有关雇员姓名、婚姻状况和结婚周年纪念日等信息。该类将周年纪念日字段定义为Nullable,并确保该字段在雇员未婚的情况下存储一个null值。当从这些字段中检索值时,该类使用HasValue属性,该属性在 Nullable 类型中可用。该属性有助于确定Nullable字段是被赋了值还是包含一个null值。 [C#]

using System; class Employee {

private string _name; private bool _married;

private Nullable _mAnniversary; public Employee(string name, bool married) {

20

第2章 公共语言运行库和类型

this._name = name; this._married = married; if (!this._married)

this._mAnniversary = null; }

public Nullable Anniversary { get {

return this._mAnniversary; } set {

if (this._married)

this._mAnniversary = value; else

this._mAnniversary = null; } }

public void ShowDetails() {

Console.WriteLine();

Console.WriteLine(\

Console.WriteLine(\ if (this._mAnniversary.HasValue)

Console.WriteLine(\ else

Console.WriteLine(\ }

static void Main(string[] args) {

Employee e1 = new Employee(\ e1.Anniversary = DateTime.Today.AddMonths(-5); e1.ShowDetails();

Employee e2 = new Employee(\ e2.Anniversary = DateTime.Today.AddMonths(-10); e2.ShowDetails(); Console.ReadLine(); } }

21


DotNetFramework大学题库 - 图文(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:胸怀天下事 满耳读书声 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: