c# - 多个构造函数与静态 Create 方法

标签 c# oop

作为“javaland”程序员,我习惯了工厂方法和多个构造函数。 我对工厂模式的主要用途是将决策延迟到运行时,在实例化期间执行某种副作用或限制或隐藏具体类型。 当我深入研究 C# 时,我看到越来越多的 API 混合了多个构造函数和静态 Create 方法。

例如,XmlReaderXmlTextReader . XmlWriterXmlTextWriter .

我的问题是:

  1. Create 方法有什么特别之处还是只是一种约定(如 java: getInstance)?
  2. C# 中关于工厂方法与构造函数的最佳做法是什么?例如,为什么有几个 Create 方法接受 XmlWriter 中的 XmlWriterSettings 参数,而 XmlTextWriter 中没有构造函数同一个目的?而且,另一方面,为什么只有构造函数接受 Encoding 参数?
  3. 我想主要问题是,在惯用的 C# 中,建议何时公开工厂方法以及何时应该公开公共(public)构造函数?

最佳答案

1) 我所知道的唯一区别是泛型类型推断是 supported for methods but not for constructors .因此,你可以这样写:

var str = "foo";
var num = 42;
var tuple = Tuple.Create(str, num);

如果你想使用构造函数(不幸的是 Tuple 没有公共(public)构造函数,所以这个例子不会编译)你必须这样写:

var tuple = new Tuple<string, int>(str, num);

当然这只适用于泛型类型的构造函数,所以这不完全是主流差异。

2) 我怀疑这是一个“随机”的决定(如果“随机”听起来很刺耳,那么我们可以说“没有首先考虑最佳实践”),但我不没有任何数据支持这一点。

3) 工厂方法也是您可以返回转换为其祖先类型之一的对象的唯一方法。有时这不仅是可取的,而且是必要的,因为您的类型的用户可能不知道他们应该构造什么类型。例如,考虑一个返回 Stream 的工厂方法,它可能是 RedStreamBlueStream,具体取决于某些输入参数。

关于c# - 多个构造函数与静态 Create 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7308831/

相关文章:

c# - 通过 Entity Framework 执行 SProc 时未获取毫秒数据

c# - 保存 OpenXML 文档时操作共享字符串表

c# - 你能写 Javascript object init shorthand C# style 吗?

java - 对于何时编写静态方法与实例方法,是否有经验法则?

PHP 面向对象 "Implementation must be compatible"

c# - 检测到自引用循环

c# - 系统不支持异常: 'Collection is read-only.' thrown when removing object from iList

java - 如何避免使用领域驱动设计拥有非常大的对象

c++ - 如果未满足某些条件,从方法返回什么?

oop - 组件与库