博客--------(星仔--未来)

创造未来

导航

C# 泛型和初解

原著:Bradley L. Jones
原文http://www.developer.com/net/net/article.php/2229511
    泛型是微软为C#语言增加的一个新的特性。尽管它还不是ECMA或ISO定义的C#语言规范中的一部分,但不久就会成为标准。

    泛型可以帮助你写出更具有可重用性的软件组件代码。它是数据的一种类型,包含有相同的代码;然而,参数的数据类型在每次使用时可以改变。另外,数据的使用可以适应不同的数据类型。可以说,泛型是用于不同类型的相同代码的一个模板。每当使用泛型的时候,可以使用任何不同的自定义类型,而不必重写内部代码。

    尽管泛型是新的,但我们在以前的C#中也可以获得相同的功能,这些功能是通过类型转换和多态性得到的。然而,适用泛型却可以避免繁杂的转换操作,以及从引用类型到本地类型的强转换。另外,你还可以建立更加类型安全的常用程序。

    泛型定义了一些符号。下面是一个名为Compare的基本泛型类型的代码,用于比较具有相同类型的两个值的大小,并根据调用的方法返回较大值或较小值:

public class Compare<ItemType, ItemType> {
    public ItemType Larger(ItemType data1, ItemType data2) {
        // logic ...
    }

    public ItemType Smaller(ItemType data1, ItemType data2) {
        // logic ...
    }
}

    这个泛型类型可以用于任何数据类型,从基本的数据类型如整型到复杂的类或结构均可。当你使用这个泛型类型时,你需要指定你所使用的数据类型。例如,要对两个整数使用Compare类,你需要使用下面这样的代码:

Compare<int, int> compare = new Compare<int, int>;
int MyInt = compare.Larger(3, 5);

    当然你也可以使用其它的类型。需要牢记的是这是一个已声明的泛型类型,如上面例子中的Compare类,是强类型的。这意味着,如果你为上面例子中的compare.Larger()方法传递一个非整型值,编译器会报告一个错误。如果你想比较另外一种数据类型的数据,你需要声明该泛型类型的另外一个实例:

Compare<float, float> f_compare = new Compare<float, float>;
float MyFloat = f_compare.Larger(1.22f, 4.32f);

    因为你可以将泛型用于不同的类型,因此你不必由该院有的泛型代码。

    这里的例子只是泛型最简单的使用方法。你将会发现,在实际使用泛型的时候你希望一类类型参数能够遵守更多的要求。方法之一——也是正确的方法——是使用约束。约束是类型参数必须继承或实现的一个基类或接口。例如,在上面的Compare类中,为了使所有类型都能够正常工作,你需要强制作为类型参数的每种数据类型都实现了.NET Framework中的IComparable接口。

    你可以通过在泛型类声明的后面添加约束来强制它们。你可以通过C#中的关键字where来指定一个约束:

public class Compare<ItemType, ItemType> where ItemType : IComparable {
    public ItemType Larger(ItemType data1, ItemType data2) {
        // logic ...
    }

    public ItemType Smaller(ItemType data1, ItemType data2) {
        // logic ...
    }
}

posted on 2005-09-13 14:42  星仔  阅读(302)  评论(0编辑  收藏  举报