使用泛型方法而不是方法参数

时间:2010-12-11 11:50:06

标签: c# generics

我正在使用具有此方法的框架

public static void Initialize<T>() where T : Game;

在示例代码中,您可以像这样初始化您的游戏

TargetDevice.Initialize<MyGame>();

我想知道使用初始化风格有什么好处

public static void Initialize<T>() where T : Game;
TargetDevice.Initialize<MyGame>();

而不是

public static void Initialize(Game game);
TargetDevice.Initialize(new MyGame());

初始化方法的通用样式是否有我能读到的任何名称?我为什么要选择一种风格而不是另一种?

感谢。

1 个答案:

答案 0 :(得分:5)

如果你的意思是:

Foo<T>()

Foo(Type type)

然后两者都有优点。当使用反射加载类型时,后者更方便(也许你的Game类型来自插件?) - 泛型和反射不会很方便地混合。

当在编译时知道所有内容时,通用版本很方便;您可以通过编译器强制执行的约束等添加其他验证。如果您特别想要使用T,例如通过Comparer<T>.DefaultEqualityComparer<T>.Default使用通用比较(强调:这些只是示例) - 它可以访问许多常见模式,这也很方便,同时在适当的时候避免像拳击这样的事情。

在你的情况下,由于T : Game,拳击不是问题(我假设Game是一个类,而不是一个接口)。你可以走任何一条路; List<Game>几乎与略微更具体List<T>T : Game)一样有效,因此不太可能导致问题。

如果涉及反思,我会使用第二种形式,或许同时提供:

void Foo<T>() where T : Game
{
    Foo(typeof(T));
}
void Foo(Type type) {...}

可以模拟大多数通用功能 - 例如Activator.CreateInstance(type)代替new T() - 或者转换为已知接口代替T : ISomeInterface。您没有使用“约束”操作码,但在​​您的情况下无论如何都不适用。