泛型类与泛型方法

时间:2018-09-05 08:59:00

标签: c# generics

我正在设计一个能够反序列化某些文件的类,并且我想知道这两个选项的含义是什么

// option 1 - generic class
public class XmlConfigurationManager<T>
{
    public T ReadConfigurationAndWriteDefault(string configurationPath, Func<T> defaultConfiguration)
    {
        ...
    }

    public T Deserialize(string configurationPath)
    {
        ...
    }
}

// option 2 - generic methods in non generic class
public class XmlConfigurationManager
{
    public T ReadConfigurationAndWriteDefault<T>(string configurationPath, Func<T> defaultConfiguration)
    {
        ...
    }

    public T Deserialize<T>(string configurationPath)
    {
        ...
    }
}

我似乎找不到关于两者之间差异的任何提示。

这两个选项如何比较? 有什么区别吗? 在评估设计时,有什么要注意的地方吗?

2 个答案:

答案 0 :(得分:3)

我马上就能想到一个区别:

  • 通用类:您必须为要反序列化的每种文件类型实例化具有某种类型的对象。尽管您可以长期使用实例来保留特定于类型的参数。
  • 泛型方法:您将实例化该类一次,并根据需要使用泛型方法处理尽可能多的类型(假设您将处理类型的差异,如果有的话)。

例如,如果您只想将文件(json)的内容反序列化为对象,则通用方法就足够了,因为所需的类型不会改变任何内容。

答案 1 :(得分:2)

区别很细微:

  • 使用泛型类,您将能够使用泛型属性,将其与泛型类上的泛型方法一起使用。
  • 对于代码可重用性,您最好使用通用类。尽管您可以执行此操作,但您不想在不同的非泛型类上再次调用相同的泛型方法,但这不是一个好习惯。您想将所有相关的通用方法放在通用类下。
  • 使用通用类,您在类中传递的实体类型可以被所有通用方法和所有通用属性进一步使用。仅使用通用方法,就不能重用它,与使用通用类不同。