`
coollifer
  • 浏览: 55804 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

C#之泛型

    博客分类:
  • C#
 
阅读更多

1、泛型概述

  • 泛型可将具体类型的指定推迟到客户端代码声明并实例化类的时候。
  • 使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高程序的性能。
  • 泛型最常见的用途是创建集合类。
  • NET Framework 类库在 System.Collections.Generic 命名空间中包含几个泛型集合类。应尽可能地使用这些类来代替普通的类,如 System.Collections 命名空间中的 ArrayList等集合类。

2.泛型优点

  • 通过创建泛型类,您可以创建一个在编译时类型安全的集合(编译时进行类型检查)。
  1. 代码说明:

System.Collections.ArrayList list = new System.Collections.ArrayList();.

list.Add(3);

list.Add("It is raining in Redmond.");

int t = 0;

foreach (int x in list)//编译是这里不抛异常,至到运行时报错

{

    t += x;

}
 

 

如上代码,尽管将字符串和 int组合在一个 ArrayList 中的做法在创建异类集合时是完全合法的,因为 ArrayList 将把所有项都强制转换为 Object, 但这种做法更可能产生编程错误,并且直到运行时才能检测到此错误。

  • 通过创建泛型类,可以提高程序的性能,避免不必要的强制转换、装箱、拆箱操作。
  1. 代码说明:

System.Collections.ArrayList list1 = new System.Collections.ArrayList();

list1.Add(3);

list1.Add(105);

 

System.Collections.ArrayList list2 = new System.Collections.ArrayList();

list2.Add("It is raining in Redmond.");

list2.Add("It is snowing in the mountains.");
 

 

上例代码说明ArrayList 是一个使用起来非常方便的集合类,无需进行修改即可用来存储任何引用或值类型。但这种方便是需要付出代价的。添加到 ArrayList 中的任何引用或值类型都将隐式地向上强制转换为 Object。如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时进行拆箱操作。强制转换以及装箱和拆箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和拆箱的影响非常明显。

3. 泛型的类型参数

类型参数是客户端在实例化泛型类型的变量时指定的特定类型的占位符。(如下示例)

 public class GenericList<T> //T为泛型的类型参数,但在客户端代码中指定T的具体类型时,泛型中的所有T都替换为具体的类型
    {
        //定义一个嵌套类
        private class Node
        {
            public Node(T t)
            {
                next = null;
                data = t;
            }
            private Node next;

            public Node Next
            {
                get { return next; }
                set { next = value; }
            }
            private T data;
            public T Data
            {
                get { return data; }
                set { data = value; }
            }
        }
        private Node head;//声明一个嵌套类的变量

        public GenericList()
        {
            head = null;
            
        }

        //泛型类的添加成员方法
        public void AddHead(T t)
        {
            Node n = new Node(t);
            n.Next = head;
            head = n;
        }

        //用于泛型类集合的遍历
        public IEnumerator<T> GetEnumerator()
        {
            Node current = head;
            while (current != null)
            {
                yield return current.Data;
                current = current.Next;
            }
        }
       

    }
 

 

   static void Main(string[] args)
        {
            GenericList<int> list = new GenericList<int>();

            for (int x = 0; x < 10; x++)
            {
                list.AddHead(x);
            }

            foreach (int i in list)
            {
                System.Console.Write(i + " ");
            }
            System.Console.WriteLine("\nDone");
            Console.Read();
 

 

4. 泛型和数组

在 C# 2.0 中,下限为零的一维数组自动实现 IList<T>。这使您可以创建能够使用相同代码循环访问数组和其他集合类型的泛型方法。如下示例

 

class Program
{
    static void Main()
    {
        int[] arr = { 0, 1, 2, 3, 4 };
        List<int> list = new List<int>();

        for (int x = 5; x < 10; x++)
        {
            list.Add(x);
        }

        ProcessItems<int>(arr);
        ProcessItems<int>(list);
    }

    static void ProcessItems<T>(IList<T> coll)
    {
        foreach (T item in coll)
        {
            System.Console.Write(item.ToString() + " ");
        }
        System.Console.WriteLine();
    }
}
 
分享到:
评论

相关推荐

    C# 之泛型详解

    泛型是C#编程语言中的一个重要特性,它允许开发者创建可重用的代码模板,这些模板可以在多种数据类型上工作,而无需重复编写相同逻辑。泛型的主要目标是提高代码的效率、安全性和复用性。 在传统的C#编程中,如果...

    C#之泛型详解.docx

    泛型是C#编程语言中的一个重要特性,它允许开发者创建可重用的代码模板,这些模板可以在多种数据类型上工作,从而提高了代码的灵活性、效率和安全性。...理解和熟练运用泛型是每个C#开发者必备的技能之一。

    C#【泛型】实现的【通用】结构体转字节数组

    C#【泛型】实现的【通用】结构体转字节数组,包含网上收集的网页参考资料、非通用的【StructTest】工程、泛型实现的通用【Struct2BytesGenericType】工程。 VS2010编译运行。

    C#泛型类、泛型方法、泛型接口、泛型委托的实例

    在C#编程中,泛型是一种强大的工具,它允许我们编写可重用的代码,同时保持类型安全性和高效性。本文将深入探讨泛型类、泛型方法、泛型接口和泛型委托,并通过实例来阐述它们的应用。 首先,我们来看泛型类。泛型类...

    C#常用泛型类型.rar

    在C#编程语言中,泛型是一...总之,这份资源是学习C#泛型的宝贵材料,特别是对`Dictionary, TValue&gt;`和`List&lt;T&gt;`这两个常用泛型类型的应用有很好的示例。通过实践这些代码,读者可以加深对泛型的理解,提升C#编程能力。

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

    ### C#2.0 泛型和强制类型转换 #### 泛型介绍 在C#2.0中,泛型是一种强大的特性,它允许程序员编写类型安全且高度可重用的代码。通过使用泛型,可以创建参数化的类型,这意味着在类、接口或方法中可以使用类型参数...

    C#泛型、反射实例、自动生成sql语句

    本篇文章将详细探讨C#中的泛型、反射以及如何利用这些特性来实现自动生成SQL语句。 **一、C# 泛型** 泛型是C#的一个核心特性,它允许我们编写类型参数化的代码,即代码可以在多种数据类型上工作,而无需进行显式的...

    C# 简单 泛型 用法

    本文将深入探讨C#中的泛型,它是C#的一个重要特性,对于初学者来说,理解并掌握泛型是提高编程效率和代码复用性的关键。 泛型在C#中引入的主要目的是为了提高类型安全性和性能。它允许我们在编写代码时定义不特定于...

    关于C#、java泛型的看法

    C#的泛型在类型检查和性能方面可能更胜一筹,而Java的泛型则在类型擦除和向后兼容性上有其独特之处。选择哪种语言的泛型取决于具体项目的需求和开发环境。了解并熟练掌握这两种语言的泛型特性,对于提升开发效率和...

    C#泛型,非泛型实现枚举

    在C#编程中,泛型和枚举是两种非常重要的概念。泛型提供了一种方式,使得代码可以处理多种数据类型,而无需为每种类型重复编写相同逻辑。枚举则是用于定义一组预定义的常量,便于表示一组相关的值。下面我们将详细...

    C# where泛型约束测试代码

    在C#编程语言中,`where`关键字是用于泛型约束的重要组成部分,它允许我们对泛型类型参数施加特定的限制,确保在使用泛型类、接口或方法时,传递的类型必须满足这些约束条件。`where`泛型约束在提高代码的灵活性和...

    C#的泛型C#的泛型

    在深入理解C#泛型之前,需要了解其背后的编译原理。C#的泛型是由.NET运行时环境(CLR)支持的,这意味着泛型代码在编译阶段并不会生成针对特定类型的代码,而是生成一种特殊形式的中间语言(IL)代码。 当程序运行...

    C# 泛型 C# 泛型

    C# 泛型是.NET框架中的一个重要特性,它允许开发者创建可重用的类型化代码,这些代码可以处理多种数据类型。泛型提高了代码的效率、安全性和灵活性,避免了不必要的类型转换,并提供了更强的类型检查。在C#中,泛型...

    C# 工具类 泛型转JSON(Newtonsoft.Json)

    C# 工具类 泛型转JSON 使用 Newtonsoft.Json 转换JSON

    C# 泛型的好处讲解

    本文将深入探讨C#泛型的几个关键优势,并通过具体的示例来解释如何有效地使用泛型。 #### 二、泛型的概念与优势 ##### 2.1 概念 泛型是C#中一种高级特性,允许程序员在声明类、接口或方法时使用占位符类型(通常用...

    c# 利用泛型解析xml文件

    在C#编程中,泛型是一种强大的特性,它允许我们创建可重用的代码模板,这些模板可以在多种数据类型上工作。当我们谈论“利用泛型解析XML文件”时,我们实际上是在讨论如何使用C#的泛型类和方法来处理XML数据。XML是...

    c# 泛型的使用,教你如何用泛型

    在C#编程语言中,泛型是一种强大的特性,它允许我们编写可重用的代码,同时保持类型安全和性能。泛型是C# 2.0版本引入的新特性,极大地提高了代码的灵活性和效率。本篇文章将深入探讨C#中的泛型使用方法,帮助你更好...

Global site tag (gtag.js) - Google Analytics