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();
    
            }
        }
    }

    程序输出结果为:

  • 相关阅读:
    DataType--数值类型
    Scala中List(Map1,Map2,Map3 ....) 转成一个Map
    Scala中集合类型与java中集合类型转换
    oracle查询数据库最大连接数等信息
    kafka_2.11-0.10.2.1中的auto.offset.reset
    IOS设备信息与机型对照表
    shell 后台执行脚本
    Spark的操作列表
    hive表支持中文设置
    编译Spark2.1.2源码
  • 原文地址:https://www.cnblogs.com/mcgrady/p/2575126.html
Copyright © 2011-2022 走看看