C#泛型编程指导原则(五)

原创 2007年09月14日 13:53:00

Item 5: Genericize Types That Vary Only by a Data Type将由数据类型引起变化的类型泛型化

如果你通读以下自己代码中现存的类、方法、接口、委托,你会发现,自己一般会使用一个类型所包含/管理的类型来定义它。在这些情况下,需要考虑是否要应用泛型,从而可以使一个单独的实现就可以为多种数据类型提供服务。在这样的场景下应用泛型可以产生一系列的积极作用,包括减少代码的大小,提高类型安全性等等。

一.消除冗赘的数据容器:

迄今为止,数据容器是用来进行泛型重构的最通用、最直接的领域之一。大多数的解决方案至少有一或两个这样的例子:为了向ArrayList的安全性妥协,你创建了自己的类型安全的包装类。

如:

public class PersonCollection

{

private ArrayList _persons;

public PersonCollection()

{

_persons = new ArrayList();

}

public void Add(Person person)

{

_persons.Add(person);

}

public Person this[int index]

 {

get { return (Person)_persons[index]; }

}

}

 

public class OrderCollection

 {

private ArrayList _orders;

public OrderCollection()

 {

_orders = new ArrayList();

}

public void Add(Order order)

 {

_orders.Add(order);

}

public Order this[int index]

 {

get { return (Order)_orders[index]; }

}

}

这两个类封装了一个ArrayList,向客户提供了一个类型安全的接口,他们是进行泛型重构的极好候选者。这两个类,除了管理的数据类型不同外,就没有什么不同的了。

通过使用泛型集合Collection<T>可以同时获得类型安全和上述两个类提供的功能性。具体我们只要使用Collection<Person> Collection<Order>就行了。

如果你的候选类提供的功能没有被Collection<T>所直接支持,只需要简单的创建一个Collection<T>的子类,在其中加入新的自定义成员就可以了。

二.定义候选方法:

为了进行泛型重构而寻找候选方法,是很细小琐碎而又缺少精确性的科学。最常见的例子就是:一些方法在整个对象上执行了相当基本的操作,没有调用任何特别的方法。

如:

public static void Swap(ref String val1, ref String val2)

 {

String tmpObj = val2;

val2 = val1;

val1 = tmpObj;

}

public static void Swap(ref Double val1, ref Double val2)

 {

Double tmpObj = val2;

val2 = val1;

val1 = tmpObj;

}

如果有多个类型的数据要进行交换时,为了获得类型安全、避免对值类型进行装箱,需要提供一系列的overloaded方法。

如果使用Object类型作为参数的话,将引起一系列的问题,同时这样做也违背了条款2

最好的方法就是使用泛型。如下所示:

public static void Swap<T>(ref T val1, ref T val2)

 {

T tmpObj = val2;

val2 = val1;

val1 = tmpObj;

}

 

三.用一个泛型委托替换多个委托

泛型委托的引入在根本上改变了应该在何时、如何创建自己的委托。委托代表了泛型最根本、最自然的应用中的一种。

如,非泛型委托是这样的:

public delegate void MyDel1(int x, string y);

public delegate void MyDel2(int x, double y);

public delegate void MyDel3(int x, long y);

public delegate void MyDel4(int x, string y, double z);

public delegate void MyDel5(int x, double y, double z);

通过使用委托,可以使其大大简化:

public delegate void MyDel<T, U>(T x, U y);

public delegate void MyDel<T, U, V>(T x, U y, V z);

 

 

C# 2.0中泛型编程思想分析

  • 2009年11月23日 20:23
  • 20KB
  • 下载

C#类库处理异常指导原则

作为一个类库开发的新手,在面对Exception时,一直不知道所措。阅读了的异常处理部分,记录下一些基本的原则,供日后查询并与大家分享。欢迎高手指点一二。 一、善用finally块  ...
  • kmguo
  • kmguo
  • 2013年11月28日 23:54
  • 2469

XML 泛型 控件 的C#编程示例

  • 2007年12月29日 15:33
  • 273KB
  • 下载

C# 2.0中泛型编程初级入门教程

  • 2009年09月21日 17:43
  • 9KB
  • 下载

(面试)泛型的优点(C# 编程指南)

在公共语言运行库和 C# 语言的早期版本中,通用化是通过在类型与通用基类型 Object 之间进行强制转换来实现的,泛型提供了针对这种限制的解决方案。通过创建泛型类,您可以创建一个在编译时类型安全...
  • hyhyct
  • hyhyct
  • 2012年04月16日 23:26
  • 343

pp看书笔记---C#高级编程第九版 第五章 【泛型】

写在前面: 简单说一下看书的感受,这一章看了五六遍,一个星期,反反复复看,工作休息没事的时候看看,玩手机累的时候看看,躺着看电视的时候看看,终于梳理通了 看书的感受是: 1.书中有些话太过于精简...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#泛型编程指导原则(五)
举报原因:
原因补充:

(最多只允许输入30个字)