【问题标题】:Why is TimeSpan.Duration() a method rather than a property?为什么 TimeSpan.Duration() 是方法而不是属性?
【发布时间】:2016-06-22 16:20:29
【问题描述】:

TimeSpan.Duration() 将为您提供TimeSpan 的持续时间的绝对值,这在某些情况下可能很有用。

然而,它是一种方法,而不是结构的属性。 the MSDN guidelines on choosing a method or a property 的第一段声明:

一般来说,方法代表动作,属性代表数据。 属性旨在像字段一样使用,这意味着属性 不应计算复杂或产生副作用。当它 不违反以下准则,考虑使用属性, 而不是一种方法,因为经验不足的开发人员会发现 属性更易于使用。

如果成员表示该类型的逻辑属性,请考虑使用属性。

(强调他们的。)

持续时间似乎也没有违反“使用方法如果”部分。

我认为这可能是出于向后兼容性的原因,所以我去了back to the property vs method guidelines for .NET 2,它们相对没有变化。所以我想知道 .NET 1.1 是否只是没有属性,but it did,所以我也不认为这就是原因。

【问题讨论】:

  • 它返回一个新的TimeSpan 对象——这种副作用通常不是属性所期望的。不过命名还是有点不安。
  • 大概这是一个疏忽,最初只是违反了指导方针。它时不时地发生。 DateTime.Now 是一个值得注意的例子,它也是“错误”的。不幸的是,一旦进入,就很难做出改变。
  • @JeroenVannevel 它没有副作用;原始 TimeSpan 的状态没有改变。
  • 它返回一个新的 TimeSpan 对象——这样的副作用通常不是属性所期望的。不过命名还是有点不安。 -- 哇。考虑到方法名称,这是出乎意料的。也许一个相关的问题可能是“为什么TimeSpan.Duration() 返回一个新结构?”
  • Negate() 是另一个。这是一种 .NET 1.0 类型,它是在大约 17 年前编写的。 .NET 如果他们知道他们现在所知道的,那么他们肯定会看起来很多不同,但即使是大男孩也必须从版本 1 开始。你必须将它阅读为 GetDuration() 以通过减速带。它为未初始化的 TimeSpan 引发异常可能是合理的原因。为什么这对 Duration() 很重要,但对任何属性都不重要,这是一个更大的问题。

标签: c# methods properties timespan duration


【解决方案1】:

我的猜测是,这是因为它可以在边界情况下抛出 OverflowException。一般来说,属性获取器最好不要抛出异常(在某些情况下可能是 ObjectDisposedException 除外),尽管我不知道有专门说明这一点的指南。这可能包含在“产生副作用”指南中,因为抛出的异常肯定是副作用。

【讨论】:

  • Here's the guideline : “避免从属性获取器中抛出异常。”
  • 抛出的异常肯定不是副作用。
猜你喜欢
  • 2011-07-23
  • 2018-11-12
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多