泛型实现类型参数化,相当于类型占位符.
语法:
class 类名<泛型占位字母>
interface 接口名<泛型占位字母>
返回值 函数名<泛型占位字母>(参数列表)
泛型占位字母可以有多个,用逗号分开.
class TestClass<T>
{
publid T value;//一个类型为T的变量value
}
//使用时
TestClass<int> t = new TestClass<int>();//t的value变量为int类型了
TestClass<string> t2 = new TestClass<string>();//t2的value变量为string类型了
//声明之后不能改变类型了
class Testclass<T,M,Key>//泛型不仅可以是基本类型,还可以是自定义类
{
public T value1;
public M value2;
public Key value3;
}
//使用
TestClass2<int,float,string> t3 = new TestClass2<int,float,string>();
interface TestInterface<T>
{
T value
{
get;
set;
}
}
//使用
class Test : TestInterface<int>
{
public int value
{
get;
set;
}
}
普通类中的泛型方法
class Test
{
public void TestFun<T>(T value)
{
Console.WriteLine(value);
}
public void TestFun<T>()
{
T t = default(T);//获得T类型的默认值
//这里不能直接给t初始值,因为t还不知道类型,所以要用default(T)
}
public T TestFun<T>(string v)
{
return default(T);
}
public void TestFun<T,K,L>()
{
//...
}
}
//使用
Test t = new Test();
t.TestFun<string>("asdf");
泛型类的泛型函数
class Test2
{
}
//注意,普通类和泛型类可以同名,他们不是一个东西,他们之间没有关系
class Test2<T>
{
public T value;
public void TestFun<T>(T value)
{
//注意,这种函数不叫泛型函数!
//因为在类被声明时,T已被指定类型了,再次调用函数相当于是普通函数
//参数只能填写类声明时填写的类型了
//调用时直接TestFun(value)
}
public void TestFun<K>(K value)
{
//这样可以!
//用另外的泛型占位字母,与泛型类占位字母区别即可
//调用时TestFun<类型>(value)
//或者可以直接省略TestFun(value),会根据参数类型自动决定泛型类型
}
}
使用泛型可以避免一定程度的装箱拆箱
class ArrayList<T>
{
private T[] array;
public void Add(T value){}
public void Remove(T value){}
}
参考资料<唐老狮C3教程>