剖析C# 2.0泛型类的创建和使用

"一次编码,多次使用",这就是引入泛型的根源。在以前的C++中称为模板,C#泛型通过算法和数据结构支持独立编码。例如,泛型列表意味着,你不必再重写一个强类型集合。在本文中,作者将向你展示定义和使用泛型是多么容易的事情-请注意,长期以来泛型一直被认为是最高级和最困难的术语。

  一、 简介

  泛型现在在任何一种语言中都被认为是一个高级的强有力的术语。当我在C++中第一次接触模板时,我对之有些疑惑。之后,我读了Bjarne Stroustrop的《The Design and Evolution of C++》,才发现模板的使用就象C中的宏和用之来取代的简单串替换模板一样容易。其实,模板和泛型是相同的东西-尽管它们的实现稍微不同。

  C#泛型支持在使用点处才定义算法及其数据类型。在C#的一些早期版本中,我们可以证明没有泛型也可以工作,因为每种类型都是派生于一个公共基类型-object。这意味着程序员可以基于object类型定义一个栈类并且把一切东西放到该栈上(因为一切都派生于object)。然而,一个object栈意味着,Customer对象,Integer对象以及假想的对象都能被放置到同一个栈的实例上。结果是,开发者要子类化数据类型来把数据类型绑定到他们要与之交互的东西上去。例如,在编写定制的商业对象时,我们就建议定义派生于System.Collections.CollectionBase的强类型集合。原因很简单:基于object定义一切被认为是弱类型定义。

  业界的高手们在数十年前就确信强类型优于弱类型,所以.NET最终支持强类型,这看上去是很自然的事情。强类型算法当然建议类型化参数-这正是我们在泛型中所用的东西。

  十几年来,我们一直在使用字母T作为类型化参数的名字。这样,在任何泛型类使用者所提供的数据类型的地方,你都能够找到T。使用泛型的关键仅仅是提供这个T。定义泛型的关键在于实现一个方法或类,并且用特定数据类型来替换掉T。

  C#中的泛型支持另外一些提炼。例如,一个方法或类可以有多个参数化的类型并且C#泛型还支持WHERE约束-它用来具体要求类型化参数的类型。例如,如果一个泛型类型必须实现接口IDisposable,那么C#泛型是支持实现这一限制的。在文章的最后我们还要看一下约束问题。
闲话少说,让我们言归正传。

  二、 使用泛型集合

  有些人问我"面向对象编程(OOP)的承诺在哪里?",我的回答是应该从两个方面来看OOP:你所使用的OOP和你创建的OOP。如果我们简单地看一下如果没有如例如Microsoft的.NET,Borland的VCL,以及所有的第三方组件这样的OO框架,那么很多高级的应用程序几乎就无法创建。所以,我们可以说OOP已经实现了它的承诺。不错,生产好的OOP代码是困难的并且可能是极具挫败性的;但是记住,你不必须一定要通过OOP来实现你的目标。因此,下面首先让我们看一下泛型的使用。

  当你用Visual Studio或C# Express等快速开发工具创建工程时,你会看到对于System.Collections.Generic命名空间的参考引用。在这个命名空间中,存在若干泛型数据结构-它们都支持类型化的集合,散列,队列,栈,字典以及链表等。为了使用这些强有力的数据结构,你所要做的仅是提供数据类型。

  列表1显示出我们定义一个强类型集合的Customer对象是很容易的。

  列表1 这个控制台应用程序包含一个Customer类和一个基于List<T>的强类型集合Customers。

 

using System;
using System.Collections.Generic;
using System.Text;
namespace Generics{
 class Program{
  static void Main(string[] args){
   List<Customer> customers = new List<Customer>();
   customers.Add(new Customer("Motown-Jobs"));
   customers.Add(new Customer("Fatman's"));
   foreach (Customer c in customers)
   Console.WriteLine(c.CustomerName);
   Console.ReadLine();
  }
 }
 public class Customer{
  private string customerName = "";
  public string CustomerName{
   get { return customerName; }
   set { customerName = value; }
  }
  public Customer(string customerName){
   this.customerName = customerName;
  }
 }
}

  注意,我们有一个强类型集合-List<Customer>-对这个集合类本身来说不需要写一句代码。如果我们想要扩展列表customer,我们可以通过从List<Customer>继承而派生一个新类。

共3页: 上一页 1 [2]
[3]
下一页

时间: 2024-09-15 01:41:05

剖析C# 2.0泛型类的创建和使用的相关文章

彻底剖析C# 2.0泛型类的创建和使用

创建     "一次编码,多次使用",这就是引入泛型的根源.在以前的C++中称为模板,C#泛型通过算法和数据结构支持独立编码.例如,泛型列表意味着,你不必再重写一个强类型集合.在本文中,作者将向你展示定义和使用泛型是多么容易的事情-请注意,长期以来泛型一直被认为是最高级和最困难的术语. 一. 简介 泛型现在在任何一种语言中都被认为是一个高级的强有力的术语.当我在C++中第一次接触模板时,我对之有些疑惑.之后,我读了Bjarne Stroustrop的<The Design and

C# 2.0泛型类的创建和使用

"一次编码,多次使用",这就是引入泛型的根源.在以前的C++中 称为模板,C#泛型通过算法和数据结构支持独立编码.例如,泛型列表意味着, 你不必再重写一个强类型集合.在本文中,作者将向你展示定义和使用泛型是多 么容易的事情-请注意,长期以来泛型一直被认为是最高级和最困难的术语. 一.简介 泛型现在在任何一种语言中都被认为是一个高级的强有 力的术语.当我在C++中第一次接触模板时,我对之有些疑惑.之后,我读了 Bjarne Stroustrop的<The Design and Ev

异常-Kinect2.0 调用 VGB创建的.gbd文件时出错

问题描述 Kinect2.0 调用 VGB创建的.gbd文件时出错 运行Kinect browser 自带程序DiscreteGeatureBasics时,把里面的seated.gbd换成自己录制生成的gbd文件就问报错:"System.InvalidOperationException"类型的异常在 Microsoft.Kinect.VisualGestureBuilder.dll 中发生,但未在用户代码中进行处理 其他信息: This API has returned an exc

属性-VC6.0获得图片创建时间等

问题描述 VC6.0获得图片创建时间等 VC6.0编程获得图片的修改时间,创建时间(即图片属性里面的修改时间,创建时间等) 解决方案 不存在什么图片之类的,就是一般文件,用GetFileTime API就能获取.如果要获得拍摄相机.感光度.分辨率.快门等等信息,可以通过读取exif获得,google下exif codeproject就能找到代码 解决方案二: 更改文件创建时间的小程序 解决方案三: [原]VC实现修改文件创建.访问.修改时间属性 解决方案四: 怎么获取本地 图片的 创建时间,修改

指令-VC6.0中dll创建失败,编译报错怎么处理

问题描述 VC6.0中dll创建失败,编译报错怎么处理 VC6.0环境,创建DCOM的服务器. 想要生成一个dll文件,在project setting里面输入了指令 然后就出现了编译错误 这个怎么破?求各位大神解答! 解决方案 -f是参数吧,中间缺少空格. 解决方案二: nmake命令路径是否正确,是否PATH环境变量中.跟参数之间要有空格.

《Adobe Illustrator CC经典教程》—第0课0.11节创建图案

0.11 创建图案 Adobe Illustrator CC经典教程 色板不仅包含各种颜色,还包括图案.在默认的色板中,Illustrator提供了许多图案的样本,还可以创作自己的图案.在这一节,将会使用图案创作披萨饼的顶部配料. 注意: 更多关于图案的信息,请参阅第6课. 1 单击并按住工具箱中的"多边形工具".单击选择"椭圆工具".在三角形下方的空白区域单击鼠标.在椭圆对话框中,将宽度和高度均改为4pt.单击"确定"按钮. 2 选择工具箱中的

《Adobe Illustrator CC 2014中文版经典教程(彩色版)》—第1课0.2节创建新文档

0.2 创建新文档 Adobe Illustrator CC 2014中文版经典教程(彩色版) Illustrator文档中最多可包含100个画板(与Adobe InDesign中的"页面"相似).下面需要创建一个包含1个画板的文档. 注意: 更多关于如何创建和编辑新文档的信息,请参阅第4课. 1 选择"窗口">"工作区">"重置基本功能". 2 选择"文件">"新建"

《Adobe Illustrator CC 2014中文版经典教程(彩色版)》—第1课0.4节创建形状

0.4 创建形状 Adobe Illustrator CC 2014中文版经典教程(彩色版) 多样化的形状是Illustrator的基石,在本书中还将会创建很多形状.下面,将会创建几个常见的形状. 注意: 更多关于创建和编辑形状的信息,请参阅第3课. 1 在左侧的工具箱中选择"矩形工具". 2 将鼠标放至滑板的左上角(如图中"X"处).当鼠标旁出现"交叉"字样时,单击并将鼠标拖曳至画板右侧下角边缘.当灰色度量标签显示宽为16 in.高为14 in

《Adobe Illustrator CC 2014中文版经典教程(彩色版)》—第1课0.15节创建剪切蒙版

0.15 创建剪切蒙版 Adobe Illustrator CC 2014中文版经典教程(彩色版) 剪切蒙版是一个对象,它会遮罩其他图稿,让其他图稿仅在它所给形状内的部分可见--从效果而言,就是将画稿按蒙版的形状进行剪切. 接下来,将要复制蓝色圆形并使用该副本作为剪切蒙版. 注意: 更多关于剪切蒙版的信息,请参阅第14课. 1 切换到选择工具,单击选中蓝色圆形. 2 选择菜单"编辑">"复制",然后选择菜单"编辑">"贴在前