用来解决成员膨胀和类型膨胀。
一句话:就是限定类型。

声明的时候泛化:给个符号代替,和数学里面的x一样 使用的时候具化:使用的时候就要指定具体类型了,数学里x不会是英文的x,x代表的是一个具体的数,可能是1,可能是π

泛型类

泛型接口一样的通过实现类传泛型参数

  1. namespace ConsoleApp2
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. //在实例化的时候,我想给盒子装一本书,这时候我知道类型了,类型是Book。
  8. //用Book来替代我假设的泛型参数T
  9. Box<Book> box = new Box<Book>(new Book());
  10. //我想装一个苹果,类型是苹果
  11. Box<Apple> box2 = new Box<Apple>(new Apple());
  12. }
  13. class Book
  14. {
  15. public string Name { get; set; }
  16. }
  17. class Apple
  18. {
  19. public string Name { get; set; }
  20. }
  21. class Pen
  22. {
  23. public string Name { get; set; }
  24. }
  25. //一个泛型类,T只是个参数,泛指,在写的这个代码的时候我也不到是个啥类型
  26. class Box<T>
  27. {
  28. public T Goods { get; set; }
  29. public Box(T t)
  30. {
  31. this.Goods = t;
  32. }
  33. }
  34. }
  35. }

泛型方法

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //调用泛型方法会自动识别类型,可以不用写尖括号
  6. int i = Run(123, "字符串");
  7. }
  8. static T Run<T, S>(T t, S s)
  9. {
  10. //进行一系列操作后
  11. //。。。。。。
  12. return t;
  13. }
  14. }

泛型委托

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //限定了这个传入这个委托的方法的参数只能是2个,一个string,一个int
  6. Action<string, int> action = RRR;
  7. action.Invoke("第一个参数", 2)
  8. //最后一个参数返回值类型
  9. Func<int, decimal,int> func = Run;
  10. }
  11. static void RRR(string name,int a)
  12. {
  13. Console.WriteLine("哈哈哈");
  14. }
  15. static T Run<T, S>(T t, S s)
  16. {
  17. //进行一系列操作后
  18. //。。。。。。
  19. return t;
  20. }
  21. }