我正在使用具有此方法的框架
public static void Initialize<T>() where T : Game;
Run Code Online (Sandbox Code Playgroud)
在示例代码中,您可以像这样初始化您的游戏
TargetDevice.Initialize<MyGame>();
Run Code Online (Sandbox Code Playgroud)
我想知道使用初始化样式有什么好处
public static void Initialize<T>() where T : Game;
TargetDevice.Initialize<MyGame>();
Run Code Online (Sandbox Code Playgroud)
代替
public static void Initialize(Game game);
TargetDevice.Initialize(new MyGame());
Run Code Online (Sandbox Code Playgroud)
这种通用的初始化方法有没有我能读到的名字?我为什么要选择一种风格而不是另一种?
谢谢.
如果你的意思是:
Foo<T>()
Run Code Online (Sandbox Code Playgroud)
和
Foo(Type type)
Run Code Online (Sandbox Code Playgroud)
那么两者都有优点.当使用反射来加载类型时,后者更方便(也许你的Game类型来自插件?) - 泛型和反射不会非常方便地混合.
当编译时知道所有内容时,通用版本很方便; 您可以通过编译器强制执行的约束等添加其他验证.如果您特别想要使用它T,例如通过Comparer<T>.Default或使用泛型比较EqualityComparer<T>.Default(也就是强调:这些只是示例) - 它可以访问许多常见模式,同时在适当的时候避免诸如装箱之类的东西,它也可以派上用场.
在你的情况下,因为T : Game拳击不是一个问题(我假设Game是一个类,而不是一个接口).你可以走任何一条路; a List<Game>几乎与稍微更具体List<T>(在哪里T : Game)一样有效,因此不太可能导致问题.
如果涉及反思,我会使用第二种形式,也许同时提供:
void Foo<T>() where T : Game
{
Foo(typeof(T));
}
void Foo(Type type) {...}
Run Code Online (Sandbox Code Playgroud)
可以模拟大多数通用功能 - 例如Activator.CreateInstance(type)代替new T()- 或者代替已知接口进行转换T : ISomeInterface.您没有使用"约束"操作码,但在您的情况下,无论如何都不适用.