【问题标题】:Why does the XContainer.Nodes() and XElement.Attributes() are methods (not properties)?为什么 XContainer.Nodes() 和 XElement.Attributes() 是方法(不是属性)?
【发布时间】:2013-10-16 12:45:44
【问题描述】:

现在是一个理论问题。

据我了解,方法用于实现某种行为,而属性用于保留对象的某些状态。

我发现XContainer.Nodes()XElement.Attributes() 被实现为方法,而不是属性。而且,恕我直言,其他应该作为属性实现的方法:XNode.ElementsAfterSelf()XNode.ElementsBeforeSelf()XNode.NodesAfterSelf() 等等。

所以,所有返回 IEnumerable of something 的东西都在 Linq to XML 中实现为方法(而不是属性)。

这是什么原因?我的意思是它是否适用于某些特定情况,或者它只是一个错误,例如 String.Split() 方法,它返回 char array 而不是更多预期的 IEnumerable<char>

【问题讨论】:

  • 我会说,这些方法是惰性的(使用yield return而不是固态集合转换为IEnuemerable,一次只返回一个元素)是它们是方法的原因,不是属性。
  • 你可以以同样的方式从属性 get 访问器中产生 IEnumerable 的返回项,不是吗?
  • String.Split() 早于泛型,所以IEnumerable<char>(或IEnumerable<string>)在创建时并不存在。

标签: c# .net xml linq-to-xml


【解决方案1】:

引用Microsoft "Choosing Between Properties and Methods"

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

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

例如,BorderStyle 是一个属性,因为边框的样式是 ListView 的一个属性。

如果属性的值存储在进程内存中并且该属性仅提供对该值的访问,请使用属性而不是方法。

您也可以阅读"Properties vs Methods" here

我喜欢最后一个链接的解释

该操作足够昂贵,以至于您希望与用户沟通,他们应该考虑缓存结果。

【讨论】:

    猜你喜欢
    • 2016-06-22
    • 2011-07-23
    • 2011-05-13
    • 2018-11-12
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多