泛型:是一种不确定的数据类型
为什么要用泛型,先看一个小例子
定义两个普通方法
public class Method { public static void ShowInt(int IntValue) { Console.WriteLine($"IntValue={IntValue}"); } public static void ShowString(string StrValue) { Console.WriteLine($"StrValue={StrValue}"); } }
方法在创建时就确定了参数类型,如果有10,20个类型我们要写20个方法吗?
不是,还有一种方法可以试应不同类型object
我们在写一个方法
public static void ShowObj(object ObjValue) { Console.WriteLine($"ObjValue={ObjValue}"); }
这样一个object方法就可以 任何一个使用父类的地方都可以用子类代替,object是所有类型的父类,
那有这一个方法不就行了,为什么用泛型呢?
这样写有两个问题:
1:装箱拆箱 (主要是c#内存分配问题,在c#程序运行时,内存分两块空间,一个是线程栈 ,一个进程堆。
值类型在栈里,引用类型在堆里。如果我们传递一个数字1,它是值类型应该是在栈里,但是我们调用方法的时候他是一个object类型的,它传递的只是一个引用,任何一个引用类型的变量保存的只是一个引用,它会指向堆内存的一块空间。
那我们传递的是一个值类型怎么变成引用类型了-------装箱 把值类型从栈里拷贝到堆里面
那我们希望用的时候是一个int是一个值类型那么就需要------拆箱 在从堆里拷贝到栈里面
) 有性能损失。
2:类型安全问题。因为是object类型所以什么类型都能传入 没办法约束传入类型
所以就用到泛型方法: 一个方法满足不同类型的参数
方法名字后面多了个类型参数<>
public static void Show<T>(T tValue) { Console.WriteLine($"tValue={tValue}"); }
声明时没有确定类型,调用时确定 类型参数要和参数类型一致
int IntValue = 1; string StrValue = "Mike"; Console.WriteLine("=====普通方法===="); Method.ShowInt(IntValue); Method.ShowString(StrValue); Console.WriteLine("======Object======"); Method.ShowObj(IntValue); Method.ShowObj(StrValue); Console.WriteLine("======Generic====="); Method.Show<int>(IntValue); Method.Show<string>(StrValue);