当前位置:编程学习 > C#/ASP.NET >>

C# 泛型编程

     感觉对于编程这个工作,我开始一直是这样认为的,还是我们现在好。比如说语言发展了,发展成更容易理解和编程了;工具也发展了,编程的时候更方便了,比如说现在的智能提示。

          但是这样理解好像有点片面了,如果不理解一个技术的发展历史就很难真正理解它。C# 泛型编程是2.0就有的,可是自己的理解还不够,特此好好总结一下。

C# 泛型及机制
         C#泛型演示

 

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Stack<int> test = new Stack<int>();
            test.Push(10);
            Console.WriteLine(test.GetResult());
            Console.Read();
        }
    }

    class Stack<T> 
    {
        private T[] store;
        private int size;

        public Stack()
        {
            store = new T[10];
            size = 0;
        }

        public void Push(T x)
        {
            store[size++] = x;
        }

        public T Pop()
        {
            return store[--size];
        }

        public string GetResult()
        {
            return store[--size].ToString();
        }
    }
}


        C#泛型简介

所谓泛型,即通过参数化类型来实现在同一份代码上的操作多种数据类型。泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。

C#泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束

        C#泛型机制简介

C#泛型能力由CLR在运行时支持,区别于C++ 的编译时模板机制,和Java的编译时“ 搽拭法” 。这使得泛型能力可以在各个支持CLR的语言之间进行无缝的互操作。

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

       C#泛型编译机制

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

JIT编译时,当JIT编译器第一次遇到Stack<int>时,将用int替换“ 泛型版”IL代码与元数据中的T——进行泛型类型的实例化。

CLR 为所有类型参数为“ 引用类型” 的泛型类型产生同一份代码;但如果类型参数为“ 值类型” ,对每一个不同的“ 值类型” ,CLR将为其产生一份独立的代码

        C#泛型的几个特点

如果实例化泛型类型的参数相同,那么JIT编译器会重复使用该类型,因此C#的动态泛型能力避免了C++ 静态模板可能导致的代码膨胀的问题。
•C#泛型类型携带有丰富的元数据,因此C#的泛型类型可以应用于强大的反射技术。
•C#的泛型采用“ 基类,  接口,  构造器,  值类型/引用类型” 的约束方式来实现对类型参数的 “ 显式约束” ,提高了类型安全的同时,也丧失了C++ 模板基于“ 签名” 的隐式约束所具有的高灵活性。

泛型类型
         C#泛型类与结构

 

class C<U, V> { }   //合法
    class D : C<string, int> { }    //合法
    class E<U, V> : C<U, V> { }     //合法
    class F<U, V> : C<string, int> { }  //合法
    //非法
    //class G : C<U, V> { };


 


       C#除可单独声明泛型类型(包括类与结构)外,也可在基类中包含泛型类型的声明。但基类如果是泛型类,它的类型参数要么已实例化,要么来源于子类(同样是泛型类型)声明的类型参数。

        

 

补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,