C# 理解“泛型”示例有困难

C# 理解“泛型”示例有困难,c#,generics,C#,Generics,我正在阅读一本书,试图理解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()

我正在阅读一本书,试图理解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方法的参数。我理解在处理集合(如列表)时使用泛型类型占位符。然而,我不明白的是,一种方法是如何发挥作用的?代码是否只是说传入Print方法的参数类型在设计时是未知的,可以是任何类型?有人能帮我破译一下吗?谢谢。

正是你写的。通用参数也可以在方法级别使用。它们的行为与类级别完全相同,只是类型参数的范围仅限于方法。

与您编写的完全相同。通用参数也可以在方法级别使用。它们在类级别上的行为完全相同,只是类型参数的范围仅限于方法。

通过使用泛型类型声明方法,可以使方法更加灵活,因为它可以处理您选择的任何类型的变量,包括基元类型,当然,除非您指定T:class的位置

另一个非常常见的例子更好地说明了泛型方法的一种用法是SwapT,T方法:


通过使用泛型类型声明您的方法,您可以使您的方法更加灵活,因为它可以处理您选择的任何类型的变量,包括基元类型,当然,除非您指定T:class的位置

另一个非常常见的例子更好地说明了泛型方法的一种用法是SwapT,T方法:

代码是否只是说传入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
代码是否只是说传入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

由于编译器不知道T是什么,并且T不是在类级别定义的,那么编译器需要知道将参数转换为什么,这就是参数发挥作用的地方

由于编译器不知道T是什么,并且T不是在类级别定义的,那么编译器需要知道将参数转换为什么,这就是参数发挥作用的地方

这是演示泛型的最糟糕的例子。这是演示泛型的最糟糕的例子。我不太了解common,在我将近10年的.Net开发中,我从未使用过Swap。好吧,公平地说,泛型是在.Net 2.0中出现的,所以只有8年左右。我还认为,如果有人试图理解模板函数的基础知识,那么使用ref参数可能会让人感到困惑。@SRM:至少在示例代码中是很常见的。。。为了以防万一,我编辑了我的答案来注释ref关键字。我投了赞成票,我只是想指出一个潜在的混淆点。评论很好看。我想你是对的,我发现了很多使用Swap的例子。它似乎无处不在——我只是从来没有机会使用它。@SRM:我也是。可能是因为这是一个相当学术性的例子:互换在哪里起作用?我知道T是如何和参数一起使用的,但我仍然不明白为什么会有后交换。Swapref T x,ref T y会有什么不同呢?我对common不太了解,在我将近10年的.Net开发中,我从来没有使用过Swape。好吧,平心而论,泛型是在.Net 2.0中出现的,所以只有8年左右。我还认为,如果有人试图理解模板函数的基础知识,那么使用ref参数可能会让人感到困惑。@SRM:至少在示例代码中是很常见的。。。为了以防万一,我编辑了我的答案来注释ref关键字。我投了赞成票,我只是想指出一个潜在的混淆点。评论很好看。我想你是对的,我发现了很多使用Swap的例子。它似乎无处不在——我只是从来没有机会使用它。@SRM:我也是。可能是因为这是一个相当学术性的例子:互换在哪里起作用?我知道T是如何与参数一起使用的
但我仍然不明白为什么会有事后互换。Swapref T x,ref T y有什么不同?+1表示出色的描述。你的解释真的很有帮助。谢谢你的精彩描述。你的解释真的很有帮助。非常感谢。