泛型类和泛型方法,在下面的示例中将类定义为泛型类的原因是什么

本文关键字:泛型类 定义 是什么 泛型方法 在下面 | 更新日期: 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);

在这种情况下,第一个Tstring,第二个T是int

现在,Test1Test2没有什么不同。

如果你这样定义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>时,你可能不想在方法上使用它,因为在两个地方都有它实际上会为方法引入另一个泛型类型参数,它与类的参数无关…)