.NET 2.0 基础类库中的范型——其他范型类

2016-01-29 12:28 9 1 收藏

.NET 2.0 基础类库中的范型——其他范型类,.NET 2.0 基础类库中的范型——其他范型类

【 tulaoshi.com - ASP.NET 】

其他范型类 .NET 2.0 基础类库对范型的应用当然并不仅限于范型集合和 Functional Programming。下面所列的范型类也都有其明确的设计目的和用途。 Array 在.NET 2.0中,Array 类扩充了对范型编程的支持。当然,Array类本身并不是范型类(出于兼容的考虑),而是提供了一系列支持范型的方法。除了前面提到的 Functional Programming 的支持外,Array 类还对以前很多基于 object 的方法提供了对应的范型版本,这样对值类型可以提高查找和排序时的性能。例如: static int IndexOf(T[] array, T value); static void Sort(T[] array); 另外,还添加了一些新的范型方法,例如: static IList AsReadOnly(T[] array); // 返回一个只读的列表 static void Resize(ref T[] array, int newSize); // 改变数组大小 还有一个好消息是,在 .NET 2.0 中,数组将支持范型集合接口。我们知道,在 .NET 2.0 以前,Array 抽象类实现了 IList,ICollection 和 IEnumerable 集合接口,这样我们可以在需要传入这些接口的地方传入数组。在 .NET 2.0 中,范型集合需要使用如 IEnumerable 这样的范型接口,所以数组也将支持这些范型接口。然而,这些范型接口并不在 Array 类中实现(因为 Array 类本身并不是范型类),而是在运行时由 CLR 实现。例如,对于 int[],可以按如下的伪定义理解它的实现: class int[] : Array, List, ICollection, IEnumerable ArraySegment ArraySegment 表示数组中的一段。我们知道,C#/CLR 没有提供默认参数这一特性,而是要求使用函数重载。所以,不少类中有大量的针对数组参数(索引,长度)的重载方法(为了方便调用者),例如: class Encoding { public virtual byte[] GetBytes(char[] chars); public virtual byte[] GetBytes(char[] chars, int index, int count); ... } 对类的设计者来说,提供如此多的重载显得麻烦和笨拙,而且这些重载方法实际上都对应同一个实现。另外,设计如此多的虚函数也给子类的实现者带来了不少麻烦,尤其是当这些函数是 abstract 时。 在 .NET 2.0 中,微软试图通过提供 ArraySegment 类来解决这一设计问题。使用 ArraySegment 的话,类的设计者现在只需设计一个方法即可,即:(注意这不是 .NET 2.0 的真实代码,仅为说明问题) class Encoding { public virtual byte[] GetBytes(ArraySegment chars); ... } 而由调用者来决定如何传入数组参数,例如: char[] chars = ...; byte[] bytes = enc.GetBytes(new ArraySegment(chars)); 或 byte[] bytes = enc.GetBytes(new ArraySegment(chars, 0, 10)); 可以看到,使用 ArraySegment 的缺点是对使用者来说要多编写一些代码。可能是这个原因,所以目前 .NET 中并没有正式开始使用它。另外一个原因则可能是出于要和已有设计保持一致的考虑。 Nullable Nullable 值类型用于表示可能无效或者不存在的值(这个类最初的命名为 OptionalValue)。例如,在数据库设计中可能有些字段是可选,数据访问接口的设计者可以用 Nullable 来返回数据库字段。Nullable 类有两个只读实例属性 HasValue 和 Value。前者是 bool 类型用于标识是否有效,后者是 T 类型的数据。在访问 Value 之前必须先判断 HasValue 是否为 true,否则将抛出异常。 Nullable 通常用于值类型(如 Nullable),因为对引用类型来说,null 本身就可以代表无效的状态,在这种情况下使用 Nullable 并没有太多意义。 值得一提的是,C# 2.0 为 Nullable 类型提供了一个非常简洁而优美的语法,即在原始类型后加 ? 后缀,也就是说,int? 等于 Nullable。这样使得 Nullable 在 C# 中的使用非常的容易和自然(毕竟模板看起来要费眼一些J)。例如下面的代码示例: int? a = null; // a为空(即HasValue属性为false) int? b = 10; // b为10 以后,在设计可能返回无效值的 API 时,除了以前使用的抛出异常的方法外,我们也可以使用 Nullable,例如: int ParseNumber(string s); // 使用异常 int? TryParseNumber(string s); // 不使用异常,而使用Nullable EventHandler 事件的定义和使用遍及 .NET Framework 的各个角落。在没有范型的情况下,每个事件委托都要单独定义,例如: delegate void EventHandler(object sender, EventArgs e); delegate void KeyEventHandler(object sender, KeyEventArgs e); 这样的缺点是对事件定义者来说每次都要定义新的事件委托,而对使用者来说又要多学习和记忆新的事件委托。在 .NET 2.0 中,引入了 EventHandler 范型事件委托来解决这个问题,它的原型如下(注意它位于 System.Collections.Generic 命名空间中): delegate void EventHandler(object sender, T e) where T: EventArgs; 使用 EventHandler 的话,就不需要自己定义新的事件委托了,仅需提供自己的事件参数类即可(需要从 EventArgs 派生)。这样的好处一方面是可

来源:http://www.tulaoshi.com/n/20160129/1486209.html

延伸阅读
标签: PHP
前言 为什么要使用数据库类库? 初学者 (甚至一些非初学者)常常犯的错误,就是在开发应用程序的时候,缺乏对未来的考虑。假如有一天,你的程序需要使用其它的数据库,难道你还需要重新写一篇针对于这个版本数据库的程序吗?这不是不可能发生的,尤其是当目前的数据库可能不适合你当前的需要的时候。 但是当你做这一切的...
标签: ASP
  原码下载地址: http://www.codeproject.com/dotnet/ADONET_datareader/ADONET_datareader.zip Introduction ADO.NET is the .NET enhanced version of ADO that we all know and love. ADO.NET aims to address some of the deficiencies of traditional ADO such as lack of type safety, lack of an object oriented model, and ...
标签: Web开发
作为程序员,相信每个人都有自己的函数库及类库。在做项目时,从库里面提取想要的函数及类。这样可以提高开发效率。CJJ专用ASP类库中的某个class 代码如下:   '----******************** TConnString *****************************----   '数据库连接字符串结构体   Class TConnString &nbs...
在2005年底微软公司正式发布了C# 2.0,与C# 1.x相比,新版本增加了很多新特性,其中最重要的是对泛型的支持。通过泛型,我们可以定义类型安全的数据结构,而无需使用实际的数据类型。这能显著提高性能并得到更高质量的代码。泛型并不是什么新鲜的东西,他在功能上类似于C++的模板,模板多年前就已存在C++上了,并且在C++上有大量成熟应用。...
标签: PHP
  <? //以树型结构列出指定目录里的所有文件,如果你想知道自己某个目录里有哪些子目录和文件,可以调用这个类来查看,很方便的。     # 演示的例子:     $t = new TreeClimber( "asp" ); //新建物件,设置需要列出的目录:在此为asp目录     echo arrayVal...

经验教程

73

收藏

37
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部