我正在阅读一本试图用C#理解泛型的书,我遇到了一个我不明白的例子。这是示例代码。
using System;
public class Printer
{
public void Print<T>(T argument)
{
Console.WriteLine(argument.ToString());
}
static void Main(string[] arguments)
{
Printer printer = new Printer();
printer.Print<string>("Hello, World");
Console.WriteLine("Done");
Console.ReadKey();
}
}
令我困惑的是Print方法的参数。我理解在处理诸如List<T>
之类的集合时使用泛型类型占位符。但是我不明白的是<T>
如何使用方法?代码只是说传递给Print()
方法的参数类型在设计时才知道,可能是什么?有人可以帮我解读一下吗?谢谢。
答案 0 :(得分:5)
通过使用泛型类型声明方法,可以使方法更加灵活,因为它可以处理您选择的任何类型的变量,包括基本类型(当然,除非您指定where T : class
)。
更好的另一个非常常见示例说明了泛型方法的一种用法是Swap<T>(T, T)
方法:
/*
* The ref keywords mean "pass by reference" i.e. modify the variables as they
* were passed into the method.
*
* The <T> in the signature tells the compiler that T is a generic type, in case
* the class itself doesn't already declare T a generic type.
*/
public void Swap<T>(ref T x, ref T y)
{
// Tells the compiler that temp should be of the same type as x and y,
// regardless of what type T may be
T temp = x;
x = y;
y = temp;
}
int x = 3, y = 6;
Swap<int>(ref x, ref y);
Console.WriteLine(x + " " + y);
char a = 'a', b = 'b';
Swap<char>(ref a, ref b);
Console.WriteLine(a + " " + b);
答案 1 :(得分:3)
你写的正是这样。在方法级别也可以使用通用参数。它们的行为与类级别完全相同,只是类型参数的范围仅限于方法。
答案 2 :(得分:3)
代码是否只是说传递给Print()方法的参数类型在设计时才知道,可能是什么?
这正是它所说的。现在,每当编译器找到对T的引用时,它将自动替换实例或方法调用中指定的类型(如果该方法是通用的)。这种方法的一个主要例子是我多次使用(并且已经使用过)的模式。它基本上是从一种类型到另一种类型的安全演员。您要强制转换的类型被指定为通用参数。例如:
var something = SafeCast<int>("123.434"); // something == 123
var somethingElse = SafeCast<int>(23.45f); // somethingElse == 23
var somethingNull = SafeCast<int>(null); // this shouldn't throw but return a null
答案 3 :(得分:0)
由于编译器不知道T是什么,并且T没有在类级别定义,因此编译器需要知道将参数转换为什么,这就是参数发挥作用的地方;)