.NET_STAR

打造技术团队,愿与您共同开创事业!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: :: 管理 ::

简单理解:一种类型占位符,或称之为类型参数。我们知道在一个方法中,一个变量的值可以作为参数,但其实这个变量的类型本身也可以作为参数。泛型允许我们在调用的时候再指定这个类型参数是什么。在.net中,泛型能够给我们带来的两个明显好处是——类型安全和减少装箱、拆箱。

泛型的第一个好处是编译时的严格类型检查。这是集合框架最重要的特点。此外,泛型消除了绝大多数的类型转换。如果没有泛型,当你使用集合框架时,你不得不进行类型转换。

关于泛型的理解可以总结下面的一句话,它是把数据类型作为一种参数传递进来。下边的这段代码是泛型的一个最简单的应用

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            *//string 类型和int类型都实现了IComparable接口
            CompareIt<int> com = new CompareIt<int>();
           
            int i = 5;
            int j = 10;
            com.Max(i, j);
            int iResult = com.Max(i, j);
            Console.WriteLine("The Max of {0} and {1} is: {2}", i, j, iResult);

            CompareIt<string > compare3=new CompareIt<string>();
            string s1="Lesson 1";
            string s2="Lesson 2";
            string d=compare3.Max(s1, s2);
            Console.WriteLine("The Max of {0} and {1} is: {2}", s1, s2 , d);

 


        }
    }
    class CompareIt<ItemType> where ItemType : IComparable//where 是一个限制条件语句,规定了传进来的参数类型要实现了IComparable接口
    {
        public ItemType Max(ItemType item1, ItemType item2)
        {
           
            int iResult = item1.CompareTo(item2);
            if (iResult > 0)// item 1 is greater than item2
            {
                return item1;
            }
            else if (iResult < 0)// item2 is greater than item1
            {
                return item2;
            }
            return item2;
        }
   

    }
}

 


泛型的机制

  ·机制:

  C#泛型代码在被编译为IL代码和无数据时,采用特殊的占位符来表示泛型类型,并用专有的IL指令支持泛型操作。而真正的泛型实例化工作以"on-demand"的方式,发生在JIT编译时。

  ·编译机制:

  1. 第一轮编译时,编译器只为Stack<T>(栈算法)类型产生“泛型版”的IL代码与元数据-----并不进行泛型类型的实例化,T在中间只充当占位符

  2. JIT编译时,当JIT编译器第一次遇到Stack<int>时,将用int替换“泛型版”IL代码与元数据中的T---进行泛型类型的实例化。CLR为所有类型参数为“引用类型”的泛型类型产生同一份代码;但如果类型参数为“值类型”,对每一个不同的“值类型”,CLR将为其产生一份独立的代码。

 

      泛型的一些问题

  ·不支持操作符重载。我只知道这么多了

  范型的意义

  泛型的意义何在?类型安全和减少装箱、拆箱并不是泛型的意义,而是泛型带来的两个好处而已(或许在.net泛型中,这是最明显的好处了)。泛型的意义在于——把类型作为参数,它实现了代码之间的很好的横向联系,我们知道继承为代码提供了一种从上往下的纵向联系,但泛型提供了方便的横向联系(从某种程度上说,它和AOP在思想上有相通之处)。在PersonCollection例子中,我们知道Add()方法和Remove()方法的参数类型相同,但我们明确无法告诉我们的程序这一点,泛型提供了一种机制,让程序知道这些。道理虽然简单,但这样的机制或许能给我们的程序带来一些深远的变化吧。

posted on 2009-06-25 09:05  雷明  阅读(3870)  评论(0编辑  收藏  举报