使用调用构造函数的静态方法有什么好处(语义或其他)?

reg*_*ike 12 c# constructor static-methods

我刚刚更新了Visual Studio 2013,我注意到在MVC应用程序的项目模板中,ApplicationDbContext类现在有一个静态方法,它只调用构造函数:

public static ApplicationDbContext Create()
{
    return new ApplicationDbContext();
}
Run Code Online (Sandbox Code Playgroud)

这似乎对我来说很混乱,但我想有一些语义原因我现在应该开始使用ApplicationDbContext.Create()而不是new ApplicationDbContext().这样做有什么好处吗?

Dav*_*vid 17

其实.是.

在您的特定情况下,通过它包装它可以让您快速启动逻辑操作,例如使用ApplicationDbContext和singleton或以整个应用程序的通用方式处理异常.由于构造函数不能返回null,因此能够捕获异常并返回null非常重要.

Tuple.Create是泛型推理的主要示例,它不适用于构造函数.这让你说

Tuple.Create(Item1, Item2.. ItemN);
Run Code Online (Sandbox Code Playgroud)

让编译器推断类型,而不是

new Tuple<T1, T2...Tn>(Item1, Item2...ItemN);
Run Code Online (Sandbox Code Playgroud)

哪个更冗长,如果要切换其中一种类型,需要更多工作.

还有匿名类型的情况,无法明确指定,因此不能在新语句中使用.我特意有机会在搜索特定属性的程序集以链接命令结构时,我想在搜索期间使用匿名类型创建一个可枚举(在本例中为一个Queue),以便将类引用与其构造函数配对和字符串参数,而不是每次需要时查找它们.因为我可以在方法中再次使用Generic推理,所以我能够将构造函数包装在扩展方法中并完成工作.

单例模式也存在这种情况,其中您希望"GetInstance"方法通常创建一个值,或者如果存在则获取一个值.可能不符合条件,因为它比包装构造函数稍微多一点.

此外,在很多情况下,您可能希望控制实现过程,例如强制它们进入其他线程,将它们记录在数据库中以便稍后撤消,或者在权限系统上进行操作,所有这些都可以通过制作来完成构造函数包装器并添加几行逻辑,然后将构造函数私有化以避免直接调用它.

在某些情况下,我创建了一个工厂方法,该方法委托给已知的子节点,以便根据提供的参数提供返回接口或抽象的不同实现.这具有能够隐藏实现类的额外好处--Type类和IEnumerable接口使用此模式.

  • 只是一个旁注:构造函数类型参数推断(允许`new Tuple(1,2)`)是C#6中预期的新功能之一. (3认同)

Bal*_*ick 6

这种模式非常有用,特别是如果您使用私有构造函数,并从Create 返回接口类型,而不是具体类型.

private ApplicationDbContext()
{

}

public static IApplicationDbContext Create()
{
    return new ApplicationDbContext();
}
Run Code Online (Sandbox Code Playgroud)

现在,您的类的消费者将无法依赖具体实现 - 他们只能依赖抽象.