码迷,mamicode.com
首页 > 其他好文 > 详细

解释泛型的基本原理

时间:2014-08-14 08:11:58      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   os   io   strong   

分析问题

  泛型的语法和概念非常类似于C++中的模版,泛型和C++中模版的设计是为了方便设计一些更加通用的类型,而在.NET中泛型还有另外一个重要作用,那就是避免容器操作中的装箱和拆箱动作。以下代码是一个简单的泛型例子:

using System;

namespace Test
{
    class MainClass
    {
        static void Main()
        { 
            //从开放类型到封闭类型
            GenericClass<string> gc = new GenericClass<string>("我是泛型");
            Console.WriteLine(gc);
            Console.Read();
        }
    }
    class GenericClass<T>
    {
        T my;
        public GenericClass(T t)
        {
            my = t;
        }
        public override string ToString()
        {
            return my.ToString();
        }
    }
}

注意

  所有的泛型参数名称都以T开头,这是由微软在产品文档中提出的建议,作为一种编码的通用规范,笔者建议读者严格遵守这样的规范,类似的规范还有所有的接口名称都以I开头。

  在以上代码中,程序申明了一个泛型类型GenericClass<T>。不要被表面的负责所迷惑,和.NET的众多类型一样,带泛型参数的类型同样是一个确定的类型,在不被指定的情况下,它直接继承自System.Object类型,并且可以派生出其他类型。但是,泛型类型还是和普通类型有着一定的区别。通常泛型的类型被称为开放式类型,.NET的机制规定开放式类型不能被实例化,这样就确保了开放式类型的泛型参数类型在被指定之前,不会被实例化成任何对象(事实上.NET也没办法进行实例化,因为不确定需要分配多少内存给开放式类型)。在以上代码中的main方法中,指定了开放式类型的实参,这个时候重新定义了一个新的封闭式类型GenericClass<string>,针对该类型的所有实例化都是合法的。

  为开放式的类型提供泛型的实例导致了一个新的封闭式类型的生成,但这并不代表新的封闭式类型和开放式类型有任何派生继承的关系,事实上,两者在类结构图上处于同一层次,并且两者之间没有什么关系。下图解释了这一概念。

bubuko.com,布布扣

  

   在上图中,笔者构造了几个新的类型,别且用深、浅色区分了开放类型和闭合类型,读者可以清晰地看到,开放类型和闭合类型在类结构图中并没用任何区别,也没有相互间的联系。

  最后读者需要了解的是,.NET在System.Collections.Generic命名空间下定义了诸如List<>、Dictionary<,>等泛型容器,并且在System.Array中定义了一些静态的泛型方法,读者应该在编写代码时充分利用已有的容器和算法,以提高开发和系统运行的效率。

说明

  微软公司的产品文档上鼓励程序员使用新的泛型容器和方法来代替.NET1.1版本的容器和方法,以提高程序性能。

答案

  泛型类似C++中的模版,允许程序员定义更通用的类型和算法,并且在具体使用时再生成具体的封闭类型。所有带泛型参数的类型都是一个开放式类型,它不能被实例化,但具备所有封闭类型的其他特性,本质上,它和封闭类型没有区别。

  

 

解释泛型的基本原理,布布扣,bubuko.com

解释泛型的基本原理

标签:style   blog   http   color   使用   os   io   strong   

原文地址:http://www.cnblogs.com/wangjinpeng-study/p/3911618.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!