介绍:
我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为方法的参数类型不同。有没有一种办法,在方法中传入通用的数据类型,这样不就可以合并代码了吗?泛型的出现就是专门解决这个问题的。
泛型通过参数化类型来实现在同一份代码上操作多种数据类型。例如使用泛型的类型参数T,定义一个类Stack<T>,可以用Stack<int>、Stack<string>或Stack<Person>实例化它,从而使类Stack可以处理int、string、Person类型数据。这样可以避免运行时类型转换或封箱操作的代价和风险,类似C++的模板。泛型提醒的是将具体的东西模糊化,这与后面的反射正好相反。
定义:
泛型用用一个通过的数据类型T来代替object,在类实例化时指定T的类型,运行时(Runtime)自动编译为本地代码(我的理解是自动编译为对应类型的代码),运行效率和代码质量都有很大提高,并且保证数据类型安全。
泛型方法:
泛型方法是使用类型参数声明的方法
int a = find<int>(new int[]{ 3,4,5,6},6); public static int find<T>(T[] value, T val) { for (int i = 0; i < value.Length; i++) { if (value[i].Equals(val)) return i; } return -1; }
例子:
gwyy<int> a = new gwyy<int>(2); a.Push(33); a.Push(44); a.show(); gwyy<string> b = new gwyy<string>(2); b.Push("aaa"); b.Push("bbb"); b.show(); class gwyy <T> { private T[] s ; int pos = 0; public gwyy(int size) { s = new T[size]; } public void Push(T val) { s[pos] = val; pos++; } public T pop() { pos--; return s[pos]; } public void show() { foreach (T i in s) { Console.WriteLine(i); } } } //gwyy end