我正在使用具有此方法的框架
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());
初始化方法的通用样式是否有我能读到的任何名称?我为什么要选择一种风格而不是另一种?
感谢。
答案 0 :(得分:5)
如果你的意思是:
Foo<T>()
和
Foo(Type type)
然后两者都有优点。当使用反射加载类型时,后者更方便(也许你的Game
类型来自插件?) - 泛型和反射不会很方便地混合。
当在编译时知道所有内容时,通用版本很方便;您可以通过编译器强制执行的约束等添加其他验证。如果您特别想要使用T
,例如通过Comparer<T>.Default
或EqualityComparer<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
。您没有使用“约束”操作码,但在您的情况下无论如何都不适用。