前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# 泛型

C# 泛型

作者头像
明志德道
发布2023-10-21 17:27:17
1580
发布2023-10-21 17:27:17
举报
文章被收录于专栏:明志德到的IT笔记

泛型方法  ShowProp    对比    普通方法  ShowProp<T>

代码语言:javascript
复制
 public class GenericMethod
    {
        public static void Show<T>(T t)
        {
            Console.WriteLine($"传入参数是: {t},它的类型是 {t.GetType().Name}");
        }
        public static void ShowProp(object o)
        {
            Console.WriteLine($"传入参数是: {o},它的类型是 {o.GetType().Name}");
            // Console.WriteLine($"{o.Id}___{o.Name}");
            Console.WriteLine($"{((People)o).Id}___{((People)o).Name}");
        }
        public static  void  ShowProp2<T> (T t) where T : People
        {
            Console.WriteLine($"传入参数是: {t},它的类型是 {t.GetType().Name}");
            // Console.WriteLine($"{o.Id}___{o.Name}");
            Console.WriteLine($"{t.Id}_______{t.Name}");
        }


    }



   public class People
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public void Hi()
        {
            Console.WriteLine("Hi ");
        }
    }

泛型约束  Where T:

代码语言:javascript
复制
  public class GenericConstraint
    {
  

        public static  T Get<T>(T t) where T: ISports  //类型参数必须是指定的接口或是指定接口的实现。可以指定多个接口约束。接口约束也可以是泛型的。
        {
            return t;
        }

        public static T Get2<T>(T t) where T: class  //类型参数必须为类型。
        {
            return t;
        }

        public static T Get3<T>(T t) where T : struct   //类型参数必须为值类型
        {
            return t;
        }
        public static T Get4<T>(T t) where T : new() //类型参数必须有一个公有、无参的构造函数。当于其它约束联合使用时,new()约束必须放在最后。
        {
            return t;
        }
        public static T Get5<T>(T t) where T : People//类型参数必须是指定的基类型或是派生自指定的基类型。
        {
            return t;
        }
        public static T Get6<T>(T t) where T : People, ISports, IWork, new()
        {
            return t;
        }
    }

泛型类、泛型接口、泛型委托

代码语言:javascript
复制
   public class GenericClass<T>//泛型类
    {
        public T _T;
    }

    interface IGenericInterface<T>//泛型接口
    {
        T GetT(T t);
    }

    public delegate void SayHi<T>(T t);//泛型委托

协变、逆变

代码语言:javascript
复制
 class GenericExtend
    {
        ICustomListOut<Bird> customListOut = new CustomListOut<Sparrow>();//协变
        IEnumerable<Bird> birdList = new List<Sparrow>();//协变
        Func<Bird> func = new Func<Sparrow>(() => null);//协变
        ICustomListIn<Sparrow> customListIn = new CustomListIn<Bird>();//逆变
        Action<Sparrow> act = new Action<Bird>((Bird b)=> { });//逆变
    }

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

public class CustomListIn <T>: ICustomListIn< T>
    {
       public  void Show(T t)
        {
           
        }

    }

    public interface ICustomListOut<out T>
    {
        T Get();
    }

 public class CustomListOut<T> : ICustomListOut<T>
    {
        public T Get()
        {
            return default(T);
        }
    }


    public class Bird
    {
        public int Id { get; set; }

    }
    public class Sparrow: Bird
   {
        public string Name { get; set; }
    }

协变、逆变 示例

代码语言:javascript
复制
 class GenericExtend2
    {
        IMyList<Bird, Sparrow> myList1 = new MyList<Bird, Sparrow>();
        IMyList<Sparrow, Sparrow> myList2 = new MyList<Bird, Sparrow>(); //逆变   (传入类型)
        IMyList<Sparrow, Bird> myList3 = new MyList<Bird, Sparrow>();// 逆变(传入类型)+协变(返回类型)
    }
   
    public interface IMyList<in T,out U>
    {
        void Show<T>(T t);
        U Get();
        U ShowGet(T t);
    }


    public class MyList<T, U> : IMyList<T, U>
    {
        public U Get()
        {
            return default(U);
        }

        public void Show<T1>(T1 t)
        {
            Console.WriteLine($"{t.GetType().Name}");
        }

        public U ShowGet(T t)
        {
            Console.WriteLine($"{t.GetType().Name}");
            return default(U);
        }
    }

泛型缓存

代码语言:javascript
复制
  public class GenericCache<T>
    {
        private static string _ReturnString;
        static GenericCache()
        {
            _ReturnString = DateTime.Now.ToString();//DateTime.Now.ToString(); 模拟存储缓存值
        }
        public static string GetCache()
        {
            return _ReturnString;
        }
       
    }

泛型知识介绍:   https://www.cnblogs.com/cplvfx/articles/12167884.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档