gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:33:58 24 4
gpt4 key购买 nike

作为“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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com