C#泛型详解

泛型需要引用 System.Collections.Generic 命名空间

 

泛型的优势

   1.代码重用

   2.减少装箱拆箱操作,提高性能

   3.类型安全

   4.代码拓展

 

泛型方法

     1.不使用泛型

 1         public void Show(int iValue)
 2         {
 3             Console.WriteLine("非泛型方法:{0}",iValue.GetType().Name);
 4         }
 5         public void Show(string sValue)
 6         {
 7             Console.WriteLine("非泛型方法:{0}", sValue.GetType().Name);
 8         }
 9         public void Show(DateTime dValue)
10         {
11             Console.WriteLine("非泛型方法:{0}", dValue.GetType().Name);
12         }    
View Code

   或者可以传入Object 值进行Show操作,但会增加装箱拆箱操作,导致性能损失

      public void Show(object oValue)
        {
            Console.WriteLine("非泛型方法:{0}", oValue.GetType().Name);
        }

 2.使用泛型

     public void Show<T>(T t)
        {
            Console.WriteLine("泛型方法:{0}", t.GetType().Name);
        }

泛型延迟声明,在调用时在声明,可以很好的提高性能,减少装箱拆箱,调用如下

            Show<int>(1);
            Show<string>("Test");
            Show<DateTime>(DateTime.Now);        

泛型类,接口,委托

 泛型类的创建

     public class MyGeneric<T>
    {
        public void GenericClassShow()
        {
            Console.WriteLine(typeof(T).Name);
        }
    }

泛型接口的创建

    public interface IMyGeneric<T>
    {
        void Show(T t);
    }

泛型委托的创建

 public delegate void Show<T>();

泛型约束

约束说明
where T:struct结构约束,类型T必须是值类型
where T:class类型T必须是引用类型
where T:IFoo  类型T必须实现IFoo接口
where T:Foo   类型T必须派生自基类Foo
where T:new()构造函数约束,类型T必须有一个默认构造函数
where T1:T2类型T1派生自类型T2

 

 

 

 

  

 

 

    public class MyGeneric<T> where T:class,new()
    {

    }

协变与逆变

只作用于泛型接口与泛型委托

先定义一个IPeople接口,People类以及基类Women 和子类Girl

    public interface IPeople<out T>
    {
        public int Id { get; set; }
    }
    public class People<T>:IPeople<T>
    {

    }
    public class Women
    {
        
    }
    public class Girl:Women
    {

    }

 

 

 

 

 

当 IPeople<Women> women = new People<Girl>();实例化一个women类的集合时就会报错,需要加入out关键字,表示返回类型只能是T

    public interface IPeople<out T>
    {
        public int Id { get; set; }
    }

逆变同理in关键字表示传入的参数只能是T类型,这样就可以通过父类创建子类

    public class MyGeneric<T> where T:class,new()
    {
      //  IPeople<Women> women = new People<Girl>();
        IPeople<Girl> girl = new People<Women>();
    }
    public interface IPeople<in T>
    {
        public int Id { get; set; }
    }

 

转载于:https://www.cnblogs.com/sevenchen/p/7967878.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值