【问题标题】:What does Method<ClassName> mean?Method<ClassName> 是什么意思?
【发布时间】:2008-11-20 15:29:57
【问题描述】:

这种语法我已经看过几次了,我开始担心了,

例如:

iCalendar iCal = new iCalendar();
Event evt = iCal.Create<Event>();

【问题讨论】:

    标签: c# class oop generics syntax


    【解决方案1】:

    它是一个通用方法,使用类型参数声明 Create,并查看此链接以获取更多信息:

    【讨论】:

    • -1 基本上相当于仅链接的答案。虽然这些链接非常适合进一步参考,但如果您的帖子中总结的内容比一句话更详细,那就太好了。
    【解决方案2】:

    它正在调用一个通用方法 - 所以在你的情况下,该方法可以这样声明:

    public T Create<T>()
    

    您可以在尖括号中指定类型参数,就像创建泛型类型的实例一样:

    List<Event> list = new List<Event>();
    

    这有帮助吗?

    泛型方法和泛型类型之间的一个区别是编译器可以尝试推断类型参数。例如,如果您的 Create 方法改为:

    public T Copy<T>(T original)
    

    你可以打电话

    Copy(someEvent);
    

    编译器会推断出你的意思:

    Copy<Event>(someEvent);
    

    【讨论】:

    • 这会被认为是依赖注入的一种形式吗?
    • @mmmshuddup:不,我不会这么说。
    【解决方案3】:

    这是您在 C# 中提到泛型方法的方式。

    当你定义一个泛型方法时,你的代码如下:

    return-type MethodName<type-parameter-list>(parameter-list)
    

    当你调用一个泛型方法时,编译器通常会从指定的参数中推断出类型参数,比如这个例子:

    Array.ForEach(myArray, Console.WriteLine);
    

    在这个例子中,如果“myArray”是一个字符串数组,它会调用 Array.ForEach,如果它是一个 int 数组,它会调用 Array.ForEach

    有时,编译器不可能从参数中推断出类型(就像您的示例一样,根本没有参数)。在这些情况下,您必须像这样手动指定它们。

    【讨论】:

      【解决方案4】:

      它是一个实现Factory Method 模式的通用方法。

      【讨论】:

        【解决方案5】:

        这种语法只是将泛型应用于方法。它通常用于您想要控制方法的返回类型的场景。你会在使用 IoC 框架的代码中发现很多这种语法。

        【讨论】:

          猜你喜欢
          • 2019-06-22
          • 2019-10-08
          • 2020-04-29
          • 2021-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多