`

C#2.0-泛型

    博客分类:
  • C#
阅读更多
1. 泛型概述

使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。

泛型最常见的用途是创建集合类。

.NET Framework 类库在 System.Collections.Generic 命名空间中包含几个新的泛型集合类。应尽可能地使用这些类来代替普通的类,如 System.Collections 命名空间中的 ArrayList。

您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。

可以对泛型类进行约束以访问特定数据类型的方法。

关于泛型数据类型中使用的类型的信息可在运行时通过反射获取。

引用

public class GenericList<T>     //声明一个泛型类
{
    void Add(T input) { }
}


//测试泛型类

// Declare a list of type int
        GenericList<int> list1 = new GenericList<int>();
  // Declare a list of type string
        GenericList<string> list2 = new GenericList<string>();


2. ArrayList的缺点-泛型的优点

     1) 添加到 ArrayList 中的任何引用或值类型都将隐式地向上强制转换为 Object。如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时进行取消装箱操作。强制转换以及装箱和取消装箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常明显。

      2)另一个限制是缺少编译时类型检查。因为 ArrayList 将把所有项都强制转换为 Object;换句话说,ArrayList 需要一个 type parameter。这正是泛型所能提供的。

  3)泛型List比 ArrayList 更安全并且速度更快。

3. 类型参数的约束

  在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。约束是使用 where 上下文关键字指定的。

public class GenericList1<T> where T : Employee
{

      //T只能是Employee类
}

public class GenericList2<T> where T : int
{

      //T只能是int值类型

}

4.泛型类

  泛型类最常用于集合,如链接列表、哈希表、堆栈、队列、树等,其中,像从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存储数据的类型无关。

  对于大多数需要集合类的方案,推荐的方法是使用 .NET Framework 2.0 类库中所提供的类,如List, Queue,Stack,Dictionary。

5. C++ 模板和 C# 泛型之间的区别

  C# 泛型和 C++ 模板都是用于提供参数化类型支持的语言功能。然而,这两者之间存在许多差异。

C# 泛型未提供与 C++ 模板相同程度的灵活性。例如,尽管在 C# 泛型类中可以调用用户定义的运算符,但不能调用算术运算符。

C# 不允许非类型模板参数,如 template C<int i> {}。

C# 不支持显式专用化,即特定类型的模板的自定义实现。

C# 不支持部分专用化:类型参数子集的自定义实现。

C# 不允许将类型参数用作泛型类型的基类。

C# 不允许类型参数具有默认类型。

在 C# 中,尽管构造类型可用作泛型,但泛型类型参数自身不能是泛型。C++ 确实允许模板参数。

C++ 允许那些可能并非对模板中的所有类型参数都有效的代码,然后将检查该代码中是否有用作类型参数的特定类型。C# 要求相应地编写类中的代码,使之能够使用任何满足约束的类型。例如,可以在 C++ 中编写对类型参数的对象使用算术运算符 + 和 - 的函数,这会在使用不支持这些运算符的类型来实例化模板时产生错误。C# 不允许这样;唯一允许的语言构造是那些可从约束推导出来的构造。

简单实例:

          //使用System.Collections.Generic命名空间中的泛型类List
            List<int>  lInt = new List<int>();
            lInt.Add(1);
            lInt.Add(3);

            List<string>  lString = new List<string>();
            lString.Add("abc");
            lString.Add("789");

            this.listBox_testIterator.Items.Clear();
            foreach (int i in lInt)
                this.listBox_testIterator.Items.Add(i.ToString());

            this.listBox_testIterator.Items.Add("");
            foreach (string s in lString)
                this.listBox_testIterator.Items.Add(s);
分享到:
评论

相关推荐

    C#2.0 泛型和强制类型转换C#2.0 泛型和强制类型转换

    C#2.0 泛型和强制类型转换C#2.0 泛型和强制类型转换C#2.0 泛型和强制类型转换

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

    讓初學者很快的學會C# 2.0中泛型编程初级入门教程

    C#2.0的泛型编程

    C#2.0的泛型编程

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

    在2005年底微软公司正式发布了C# 2.0,与C# 1.x相比,新版本增加了很多新特性,其中最重要的是对泛型的支持。通过泛型,我们可以定义类型安全的数据结构,而无需使用实际的数据类型。这能显著提高性能并得到更高质量...

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

    基于c#的泛型编程基础教程,泛型是很有用的编程技术。

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

    本文讨论泛型使用的一般问题,比如为什么要使用泛型、泛型的编写方法、泛型中数据类型的约束、泛型 中静态成员使用要注意的问题、泛型中方法重载的问、泛型方法等,通过这些使我们可以大致了解泛型并掌握 泛型的一般...

    C# 2.0版本 泛型

    开发人员文档,非常及时的最新用法。

    c#2.0的讲解,包括c#2.0简介,泛型,匿名方法,迭代器和不完全类的内容

    c#2.0的讲解,包括c#2.0简介,泛型,匿名方法,迭代器和不完全类的内容。

    C#2.0新的语法扩充(泛型,迭代器,匿名方法)

    C#2.0新的语法扩充(泛型,迭代器,匿名方法)C#2.0新的语法扩充(泛型,迭代器,匿名方法)

    C#泛型集合与非泛型集合

    在.NET FCL为我们提供了很多...结论:如果在C#2.0版本以上,尽量使用泛型集合类,而不使用非泛型集合类。因为,1. 泛型编程是从c#2.0开始才被.net支持的。2.泛型集合在性能和类型安全方面优于非泛型集 合。 。。。。

    C#2.0规范文档

    C#2.0编码,泛型,迭代器,表达式等等规范

    C#2.0 锐利体验系列课程(1):泛型编程

    C#2.0 锐利体验系列课程(1) 一切看教程,都是很好的体验课程。连载的

    C#2.0最新体验(1)

    C#2.0 锐利体验系列课程(1):泛型编程

    C#2.0 锐利体验系列课程(1

    C#2.0 锐利体验系列课程(1泛型编程

    《初探 C# 2.0》PPT和演示代码

    大连.Net俱乐部首次活动,《初探 C# 2.0》PPT和演示代码,主要介绍了:泛型编程(用具体的测试数字比较了泛型编程和非泛型编程)、迭代器、空属类型、局部类型、匿名方法、静态类、属性访问的保护级别;感觉还不错,讲的...

    C#泛型案例与教程 c#经典案例.pdf

    C#中的泛型是在.NET Framework 2.0中引入的一种语言特性,它允许开发者定义类型安全的类、接口和方法,以便在编译时检查类型安全性,避免了类型转换和类型casting带来的 runtime 错误。 在C#中,泛型可以应用于类、...

    asp.net知识库

    C#2.0-泛型 C#2.0-extern C#2.0-可空类型 C#2.0-分部类 C#2.0-迭代器 C#2.0 的新增功能学习 泛型的序列化问题 .NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过...

    C#的泛型方法解析

    C#2.0引入了泛型这个特性,由于泛型的引入,在一定程度上极大的增强了C#的生命力,可以完成C#1.0时需要编写复杂代码才可以完成的一些功能。但是作为开发者,对于泛型可谓是又爱又恨,爱的是其强大的功能,以及该特性...

    浅谈C#2.0泛型中的变化:default关键字

    今天回答别人问题的时候,才发现原先的T.default语法被取消了,使用了新的default关键字来实现这一功能。...下面详细说明一下。之所以会用到default关键字... } }如果我们用int型来绑定泛型参数,那么T就是int型,那么注

Global site tag (gtag.js) - Google Analytics