泛型类与泛型方法

5

我正在设计一个能够反序列化某些文件的类,我想知道以下两个选项的影响:

// 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)
    {
        ...
    }
}

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

这两个选项如何比较? 它们有任何区别吗? 在评估设计时有任何值得注意的要点吗?


该类中的静态字段/数据是否相关? - Corak
3
首先,对于第一个变体,两种方法的类型参数始终相等,并在实例创建时确定;对于第二个变体,它们可以不同,并且在调用时确定。 - Slava Utesinov
1
@Corak 不行。静态字段通常是有害的 ;) - Alberto Chiesa
1
@Slava Utesinov。没错,但我希望它们能由“ReadConfigurationAndWriteDefault”入口点调用。我主要关注JIT的差异、性能(我不认为这是一个问题)或者设计考虑因素。 - Alberto Chiesa
这要看情况。如果你想让Manager与Type相关联,那么你就使用选项1。如果你想要更灵活、类似于帮助器的方法,那么你就使用选项2。 - Renatas M.
@A.Chiesa - 当然,它们往往会被滥用,但是如果按照预期使用,即作为的信息而不是该类的实例的信息,它本质上并不是邪恶的。^_^ -- 关键在于:对于泛型类,Thing<A>Thing<B>不共享静态数据。 - Corak
1个回答

6

我立刻能想到一个区别:

  • 泛型类:您需要为要反序列化的每种类型的文件实例化一个对象。尽管如果您长期使用实例,您将能够保存类型特定的参数。
  • 泛型方法:您只需实例化类一次,并且可以使用泛型方法处理所需的任意类型(假设您将处理类型差异,如果有的话)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接