zoukankan      html  css  js  c++  java
  • 读<<CLR via C#>>总结(13) 详谈泛型

      1,什么是泛型?
      答:泛型是类型的模板,类型是实例(对象)的模板。C#提供了5种泛型:类,接口,委托,结构和方法。

      2,使用泛型有什么好处?
      答:继承实现的是"代码重用",而泛型实现的是另一种形式的代码重用,即"算法重用"。总结起来有以下优点:
        1> 提高代码的可重用性。
        2> 编译时的类型安全性。当使用一个不兼容的类型的时候,会在编译时就报错,而不用等到运行时再报错,提高了类型安全性。
        3> 更佳的性能。当操作值类型实例的时候,使用泛型会减少值类型的装箱,这样在程序的托管堆上内存分配更少,垃圾回收也没那么频繁,从而能提高程序的性能。

    使用泛型类实例

      下面是一个使用泛型来实现栈的实例,Main方法定义了两个变量,stackInt和stackString。使用int和string作为类型实参来创建这两个构造类型的实例(对象)。代码如下:

    namespace GenericDemo1
    {
        //定义一个泛型类
        class MyStack<T>
        {
            T[] StackArray;//声明数组引用
            int StackPointer = 0;
    
            const int MaxStack = 10;
            bool IsStackFull//只读属性
            {
                get 
                {
                    return StackPointer >= MaxStack;
                }
            }
            bool IsStackEmpty
            {
                get
                {
                    return StackPointer <= 0;
                }
            }
    
            public void Push(T x)//入栈
            {
                if (!IsStackFull)//栈未满
                {
                    StackArray[StackPointer++] = x;
                }
            }
    
            public T Pop()//出栈
            { 
                return (!IsStackEmpty)?StackArray[--StackPointer]:StackArray[0];
            }
    
            public MyStack()//构造函数
            { 
                StackArray=new T[MaxStack];//实例化数组对象
            }
    
            public void Print()
            {
                for (int i = StackPointer - 1; i >= 0; i--)
                {
                    Console.WriteLine("Value: {0}",StackArray[i]);
                }
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                var stackInt = new MyStack<int>();//实例化构造类型,等价于MyStack<int> stackInt=new MyStack<int>();
                var stackString = new MyStack<string>();
    
                stackInt.Push(3);//调用Push方法,注意此时类型实参为int
                stackInt.Push(5);
                stackInt.Push(7);
                stackInt.Print();
    
                stackString.Push("A");//调用Push方法,注意此时类型实参为string
                stackString.Push("B");
                stackString.Print();
    
                Console.ReadKey();
    
            }
        }
    }

    程序输出结果为:

  • 相关阅读:
    PAT顶级 1015 Letter-moving Game (35分)
    PAT顶级 1008 Airline Routes (35分)(有向图的强连通分量)
    PAT顶级 1025 Keep at Most 100 Characters (35分)
    PAT顶级 1027 Larry and Inversions (35分)(树状数组)
    PAT 顶级 1026 String of Colorful Beads (35分)(尺取法)
    PAT顶级 1009 Triple Inversions (35分)(树状数组)
    Codeforces 1283F DIY Garland
    Codeforces Round #438 A. Bark to Unlock
    Codeforces Round #437 E. Buy Low Sell High
    Codeforces Round #437 C. Ordering Pizza
  • 原文地址:https://www.cnblogs.com/mcgrady/p/2575126.html
Copyright © 2011-2022 走看看