当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > .NET 2.0 基础类库中的范型:其他范型类

ASP.NET
asp.net GridView控件中模板列CheckBox全选、反选、取消
asp.net GridView 删除时弹出确认对话框(包括内容提示)
asp.net DropDownList 三级联动下拉菜单实现代码
asp DataTable添加列和行的三种方法
Asp.net 页面调用javascript变量的值
asp.net 长文章通过设定的行数分页
asp.net 定时间点执行任务的简易解决办法
asp.net 页面延时五秒,跳转到另外的页面
asp.net 动态输出透明gif图片
asp.net DataList与Repeater用法区别
asp.net Javascript获取CheckBoxList的value
asp.net程序在调式和发布之间图片路径问题的解决方法
asp.net下生成英文字符数字验证码的代码
asp.net 页面版文本框智能提示JSCode (升级版)
ASP.NET URL伪静态重写实现方法
ASP.NET 2.0 中Forms安全认证
asp.net 动态添加多个用户控件
asp.net Repeater显示父子表数据,无闪烁
asp.net 无法获取的内部内容,因为该内容不是文本 的解决方法
asp.net GridView排序简单实现

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 49 ::
收藏到网摘: n/a

其他范型类 .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 派生)。这样的好处一方面是可