当前位置:首页 > 网络编程 > 软件语言 > .NET > C#2.0 泛型概述

C#2.0 泛型概述

点击次数:48 次 发布日期:2008-11-06 07:52:14 作者:源代码网
源代码网推荐
广告载入中

1C# 泛型概述

1.1先看一个通用的结构示例

  ·结构类:

  public class Stack

  { 软件开发网 www.mscto.com

         object[] m_Items;

         public void Push(object item)

    {……}

    public object Pop()

    {……} 软件开发网 www.mscto.com

  }

  实例:

   Stack stack = new Stack(); 软件开发网 www.mscto.com

stack.Push(1);

stack.Push(2);

    int number=(int) stack.Pop();

  通用数据结构示例:

  public class Stack<T>

  {

    readonly int m_Size;

    int m_StackPointer = 0;

    T[] m_Items;

    public Stack()

        : this(100)

    { 软件开发网 www.mscto.com

    }

    public Stack(int size)

软件开发网 www.mscto.com

    {

        m_Size = size;

        m_Items = new T[m_Size];

    }

    public void Push(T item)

    {

        if (m_StackPointer >= m_Size)

            throw new StackOverflowException();

        m_Items[m_StackPointer] = item;

        m_StackPointer++;

    }

    public T Pop()

    {

软件开发网 www.mscto.com

        m_StackPointer--;

        if (m_StackPointer >= 0)

        {

            return m_Items[m_StackPointer];

        }

        else

        {

            m_StackPointer = 0;

            //throw new InvalidOperationException("Cannot pop an empty stack");

            return default(T);

        }

软件开发网 www.mscto.com

     }

   }

1.2基于Object解决方案存在的问题

1)性能问题

           ·值类型Push时要装箱处理,Pop时要取消装箱处理,造成更多的垃圾碎片,增加垃圾收集的负担。

           ·引用类型也有强制转换的开销

2)类型安全问题(更为严重)

      ·编译室任何类型都可以转换为Object,无法保证运行时的类型安全

2.什么是泛型

    通过泛型可以定义类型安全类,而不会损害类型安全、性能或工作效率

2.1什么是泛型:

      ·可以使用任何类型来生明和实例化。

      ·声明和实例化是都必须用一个特定的类型来代替一般类型 T 软件开发网 www.mscto.com

             public class Stack<T>

       {

         T[] m_Items;

         public void Push(T item)

         { ......}

          public T Pop()

          { ......}

        }

   

         Stack<int> stack = new Stack<int>();

        stack.Push(1);

         stack.Push(2);

         int number=stack.Pop();

   2通用数据结构类采用泛型实现

软件开发网 www.mscto.com

    public class Stack<T>

    {

        readonly int m_Size;

        int m_StackPointer = 0;

        T[] m_Items;

        public Stack()

            : this(100)

        {

        }

        public Stack(int size)

        {

            m_Size = size; 软件开发网 www.mscto.com

            m_Items = new T[m_Size];

        }

        public void Push(T item)

        { 软件开发网 www.mscto.com

            if (m_StackPointer >= m_Size)

                throw new StackOverflowException();

软件开发网 www.mscto.com

            m_Items[m_StackPointer] = item;

软件开发网 www.mscto.com

            m_StackPointer++;

        }

        public T Pop()

        {

            m_StackPointer--;

            if (m_StackPointer >= 0)

            { 软件开发网 www.mscto.com

                return m_Items[m_StackPointer];

            }

软件开发网 www.mscto.com

            else

            {

软件开发网 www.mscto.com

                m_StackPointer = 0;

                //throw new InvalidOperationException("Cannot pop an empty stack");

                return default(T);

            }

        } 软件开发网 www.mscto.com

    }

2.2泛型是如何实现的?

        ·.net2.0中,泛型在IL(中间语言)和CRL本身中具有本机支持

        ·编译泛型类时,就像编译其他类一样,泛型仅保留一个占位符

        ·而用特定类型实例化泛型代码,编译时会将泛型替换为实例化的特定类型

2.3泛型的好处 软件开发网 www.mscto.com

        ·一次性的开发、测试和部署代码,通过任何类型(包括将来的类型)来重用它

             ·编译器支持和类型安全

·不会强行对值类型进行装箱和取消装箱操作,或者对引用类型进行向下强制类型  转换,所以性能得到显著提高

          ---值类型,性能通常会提高200%

           ---引用类型,在访问该类型时,可以预期性能最多提高100%

2.4应用泛型

·因为ILCRL位泛型提供本机支持,所以大多数符合CRL的语言都可以利用一般泛型。

2.5泛型别名

         在文件头部使用Using为特定类型取别名

           别名的作用范围是整个文件

        using List=LinkedList<int ,string>;

        class ListClient

       {

            static void Main(string[] args)

            { 软件开发网 www.mscto.com

                List list=new List();

软件开发网 www.mscto.com

                list.AddHead(123,"AAA");

            }

        }

源代码网推荐

源代码网供稿.
上一篇: C#2.0 泛型约束  下一篇: C#接口概述
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华