现在的位置: 首页 > 综合 > 正文

C#中的范型

2013年04月13日 ⁄ 综合 ⁄ 共 1636字 ⁄ 字号 评论关闭

         前段时间,已经看了一些关于C#中范型的概念以及一些应用;但总是不很理解。今天偶然的又温习了一下以前看过的东西,终于是有所明白起来了;所以真的是要温故而知新啊,呵呵
         范型,其实也可以说是为了重复利用一些高级代码而产生的一个概念,C#中的范型和C++中的模板、java中范型的概念在语法上差不多,但是在实现上却是差别较大。
        下面就大概总结一下关于C#范型的概念以及应用。比如说常用的stack数据结构。在stack内部可以存储不同数据类型的值,比如int,long,或者是类(结构)的实例,但是不能混和存储。所以问题就出现了,stack的push和pop操作,是不是对于每一种不同的数据类型,都要写一个具体的方法呢?那样的话,代码量就会非常庞大了,并且会产生冗余代码。所以范型的概念应运而生。根据“范型”这个概念,我们可以猜测一下,其实它就是提供了一种广义上的数据类型用作定义。而在具体实现时,把具体的数据类型当作参数传递给stack类,这样生成的stack就是一个具有特定数据类型的stack了,并且可以重复利用已经定义好的pop和push操作,提高了代码的重复利用率。以下是一个利用范型定义stack的example:
public class Stack<ItemType>
{
   private ItemType[] items;

   public void Push(ItemType data)
   {
      ...
   }

   public ItemType Pop()
   {
      ...
   }
}
        在Stack类后面的尖括号中指定并声明一个名为ItemType的类型参数,泛型 Stack 类的实例将接受为其创建的类型并在本地存储该类型的数据,而不是在创建的类型与基本对象类型之间进行转换。类型参数 ItemType 充当代理,直到在实例化过程中指定了类型并将其用作内部项数组的类型(即 Push 方法的参数类型和 Pop 方法的返回类型
--------------------------------------------
        以下是使用实例化语句中的尖括号标记将原始的整数类型指定为参数,指示 Stack 类使用此类型:
Stack<int> stack = new Stack<int>();
stack.Push(3);
int x = stack.Pop();
--------------------------------------------

        执行这个操作时,程序将创建 Stack 类的新实例,其中的每个 ItemType 都被提供的整数参数替换。实际上,当程序用整数参数创建 Stack 类的新实例时,在 Stack 类内部本地存储的项目数组将为整数,而不是对象。程序还消除了与将整数压入堆栈相关联的装箱问题。此外,当程序从堆栈弹出项目时,您无需将其显式转换为相应的类型,因为 Stack 类的当前特定实例会将整数本地存储在其数据结构中。
--------------------------------------------
使用范型的优点:
        程序员只需要编写、测试、部署代码一次,即可以对不同的数据类型重复使用该代码。
        同时,编译器还会对范型进行检查。当程序使用提供的类型参数实例化范型类时,这个类型参数只能是程序在类定义中指定的类型。例如,如果程序创建了一个 Customer 对象类型的 Stack,就无法将整数压入堆栈。通过强制执行这种操作,可以生成更可靠的代码。
        此外,与其他严格的类型实现相比,泛型的 C# 实现降低了代码的膨胀速度。使用泛型创建具有类型的集合,可以在保持操作性能优势的同时避免创建每个类的特定变体。例如,程序可以创建一个参数化的 Stack 类,而无需创建用于存储整数的 IntegerStack、用于存储字符串的 StringStack 以及用于存储 Customer 类型的 CustomerStack。

 

抱歉!评论已关闭.