泛型类和泛型方法,在下面的示例中将类定义为泛型类的原因是什么
本文关键字:泛型类 定义 是什么 泛型方法 在下面 | 更新日期: 2023-09-27 18:26:24
两者之间有什么区别吗。我定义T类型的泛型类的原因是什么?
如果我只是定义方法,它的含义与定义类型T的类相同吗?
void Main()
{
Test1<int> x = new Test1<int>();
x.Test1Method(1);
Test2 x1 = new Test2();
x1.Test2Method(1);
}
public class Test1<T>
{
public void Test1Method<T>(T x)
{
Console.WriteLine(x);
}
}
public class Test2
{
public void Test2Method<T>(T x)
{
Console.WriteLine(x);
}
}
在类Test1
中,在类级别上定义的T
与在Test1Method
方法上定义的T
不同。这使得类级别上的T
变得无用。
你可以这样使用Test1
:
Test1<string> x = new Test1<string>();
x.Test1Method(1);
在这种情况下,第一个T
是string
,第二个T
是int
现在,Test1
和Test2
没有什么不同。
如果你这样定义Test1
,情况会有所不同:
public class Test1<T>
{
public void Test1Method(T x)
{
Console.WriteLine(x);
}
}
请注意,在该更改之后,Test1Method
没有通用的T
参数。现在,这个类与Test2
的不同之处在于,在Test1
中,您在对象构造时指定了T
,而在Test2
中,每次调用Test2Method
时都可以有一个不同的T
。
下面是一个如何使用这两个类的例子(在我介绍的更改之后):
Test1<int> x = new Test1<int>();
x.Test1Method(1); //valid
x.Test1Method(2); //valid
x.Test1Method("str"); //invalid
Test2 x1 = new Test2();
x1.Test2Method(1); //valid
x1.Test2Method("str"); //valid
这是不一样的,但只有当您有具有泛型类型的属性/字段(只有当类本身是泛型时才能这样做)或您有多个方法时,差异才会明显:
public class ArrayWrapper<T> {
private T[] elements;
public T get(int index) {
return elements[index];
}
public void set(int index, T value) {
elements[index] = value;
}
}
如果类上没有<T>
,T[] elements
字段将无法编译,并且可以在同一对象上使用get()
和set()
中的不同类型。
(正如Lee所指出的,当你在类上有<T>
时,你可能不想在方法上使用它,因为在两个地方都有它实际上会为方法引入另一个泛型类型参数,它与类的参数无关…)