【问题标题】:Why is System.Console exposing a SetIn method?为什么 System.Console 公开 SetIn 方法?
【发布时间】:2014-08-07 02:07:29
【问题描述】:

当我正在为System.Console 类编写适配器时,这让我印象深刻。为什么InOutError 属性与SetInSetOutSetError 方法配对?为什么不使用属性的设置器呢?这是一个架构决策还是存在阻止 .NET 框架开发人员这样做的限制?

【问题讨论】:

  • 属性设置器不应该有太多的副作用。
  • 虽然我同意你的一般情况,但这仍然是一个非常自以为是的论点。我的意思是,我不认为将 TextReader 交换为“太多副作用”。这正是我对设置这些值之一的期望。此外,如果它真的有太多的副作用,为什么首先要通过 SetIn() 来暴露它?
  • 好问题。我的猜测与每个安全性 Attributes 的不同有关。我想知道早期版本是否对属性范围有限制,这迫使设计人员使用 set 方法。或者另一个想法是,他们明确希望引起人们对所需安全权限的关注。
  • 猜的不错,但是反编译代码后,我们可以看到它们使用了相同的属性。所以这也不是:-/
  • 这只是我的猜测,所以我不想回答,以防我错了。不过谢谢:)

标签: c# .net properties architecture


【解决方案1】:

我不能代表原作者发言,但至少有五个充分的理由将 set 方法与属性 getter(可能还有受保护的 setter)结合使用:

  1. 设置值时需要额外的参数(输入或输出)。
  2. 您需要设置器的多个重载。也许通过字符串以及特定类型来设置一些特定类型的属性是很常见的。
  3. 设置和获取需要不同的属性或权限。
  4. 更新属性与设置值的功能不同。例如,考虑一个客户端代理类,它除了允许用户设置需要传播到服务器的值之外,还必须更新服务器数据中的值。
  5. 也许您希望分离接口以获得协方差,这样您就需要在不同的接口上使用 getter 和 setter。

说了这么多,我在 dotPeek 中查看了上述方法的代码(SetInget_In)。我找不到任何不使用 setter 的借口。 In getter 具有与SetIn 方法相同的权限属性。

【讨论】:

  • 这正是我的想法。尽管所有这些理由都​​是完全正确的,但它们似乎都不适用于这个设计决策。因此,我面临的审问。好的评论仍然:)
猜你喜欢
  • 2019-05-07
  • 2011-02-17
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 2012-01-04
  • 2012-01-09
  • 2016-07-17
  • 2011-01-04
相关资源
最近更新 更多