何时使用属性而不是函数

Ste*_*eve 46 c# coding-style properties

这可能是个人偏好的问题,但是什么时候在代码中使用属性而不是函数

例如,我可以说得到一个错误日志

string GetErrorLog()
{
      return m_ErrorLog;
}
Run Code Online (Sandbox Code Playgroud)

或者我可以

string ErrorLog
{
     get { return m_ErrorLog; }
}
Run Code Online (Sandbox Code Playgroud)

你如何决定使用哪一个?我的用法似乎不一致,我正在寻找一个好的一般经验法则.谢谢.

Ree*_*sey 72

如果满足以下条件,我倾向于使用属性:

  • 该属性将返回单个逻辑值
  • 很少或没有逻辑(通常只返回一个值,或做一个小的检查/返回值)

如果满足以下条件,我倾向于使用方法:

  • 返回值将涉及重要的工作 - 即:它将从数据库获取,或者可能需要"时间"的东西
  • 获取或设置值时涉及相当多的逻辑

此外,我建议查看Microsoft的财产使用设计指南.他们建议:

当成员是逻辑数据成员时,请使用属性.

使用方法时:

  • 该操作是转换,例如Object.ToString.
  • 操作非常昂贵,您希望与用户通信他们应该考虑缓存结果.
  • 使用get访问器获取属性值会产生可观察到的副作用.
  • 连续两次调用该成员会产生不同的结果.
  • 执行顺序很重要.请注意,应该能够以任何顺序设置和检索类型的属性.
  • 该成员是静态的,但返回一个可以更改的值.
  • 该成员返回一个数组.返回数组的属性可能会产生误导.通常需要返回内部数组的副本,以便用户无法更改内部状态.这与用户可以轻易地认为它是索引属性的事实相结合,导致代码效率低下.在下面的代码示例中,每次对Methods属性的调用都会创建数组的副本.结果,将在以下循环中创建2n + 1个阵列副本.

  • 我想补充一点,你的方法应该只有一个责任.不要创建大量的方法这些代码做不同的事情.将每个不同的工作拆分为私有方法,甚至拆分为另一个类中的方法 (2认同)
  • 我在上面的列表中添加了成员​​应该是属性,如果它需要暴露给数据绑定. (2认同)

Rya*_*ndy 12

以下是Microsoft的指南:

在属性和方法之间进行选择

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

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

  • 在以下情况下,请使用方法而不是属性.

    • 该操作比字段集慢几个数量级.如果您甚至考虑提供异步版本的操作以避免阻塞线程,则很可能该操作太昂贵而无法成为属性.特别是,访问网络或文件系统的操作(初始化除了一次)应该最有可能是方法,而不是属性.

    • 该操作是转换,例如Object.ToString方法.

    • 每次调用操作时,操作都会返回不同的结果,即使参数没有更改.例如,NewGuid方法每次调用时都返回不同的值.

    • 该手术具有显着且可观察到的副作用.请注意,填充内部缓存通常不被视为可观察的副作用.

    • 该操作返回内部状态的副本(这不包括堆栈上返回的值类型对象的副本).

    • 该操作返回一个数组.


Ant*_*nes 5

我明确语义是"从对象中获取一些值"时使用属性.然而,使用一种方法是一种很好的沟通方式"这可能需要一些微不足道的努力来回报".

例如,集合可以具有Count属性.假设一个集合对象知道当前持有多少项而没有它实际上必须遍历它们并计算它们是合理的.

在手上,这个假设的集合可以有GetSum()方法,它返回所持有的项目集合的总和.该集合只是一个轻松拥有Sum属性,但通过使用一种方法,它传达了这个集合必须做一些真正的工作才能得到答案的想法.