何时使用属性而不是函数

时间:2009-09-03 15:49:20

标签: c# properties coding-style

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

例如,要获取错误日志,我可以说

string GetErrorLog()
{
      return m_ErrorLog;
}

或者我可以

string ErrorLog
{
     get { return m_ErrorLog; }
}

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

6 个答案:

答案 0 :(得分:70)

如果以下情况属实,我倾向于使用属性:

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

如果以下情况属实,我倾向于使用方法:

  • 返回值会涉及大量工作 - 即:它将从数据库中获取,或者可能需要“时间”的内容
  • 在获取或设置值
  • 时涉及相当多的逻辑

此外,我建议您查看Microsoft's Design Guidelines for Property Usage。他们建议:

  

当成员是逻辑数据成员时使用属性。

     

在以下时间使用方法:

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

答案 1 :(得分:12)

以下是Microsoft的指南:

Choosing Between Properties and Methods

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

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

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

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

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

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

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

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

    •   
    • 该操作返回一个数组。

    •   
  •   

答案 2 :(得分:5)

我清楚语义是“从对象中获取某些值”时使用属性。然而,使用一种方法是一种很好的沟通方式“这可能需要的不仅仅是一些微不足道的回报”。

例如,集合可以具有Count属性。假设一个集合对象知道当前持有多少项而不实际需要循环它们并计算它们是合理的。

这个假设的集合可以有GetSum()方法,它返回所持有的项目集合的总和。该集合只是一个容易拥有Sum属性的代替,但是通过使用一种方法,它传达了集合必须做一些实际工作才能得到答案的想法。

答案 3 :(得分:2)

如果我可能影响多个字段,我永远不会使用属性 - 我总是使用方法。

一般来说,我只是使用了 public string ErrorLog {get;私人集; } 属性的语法和其他所有的方法。

答案 4 :(得分:2)

除了Reed的回答,当该属性只是像获取事件日志这样的资源时可能是一个吸气剂。我试着只在属性没有副作用时才使用属性。

答案 5 :(得分:2)

如果某个属性中发生的事情不仅仅是微不足道的事情,那么它应该是一种方法。例如,如果您的ErrorLog getter属性实际上正在进行并且正在读取文件,那么它应该是一种方法。访问属性应该很快,如果它正在进行大量处理,它应该是一种方法。如果访问该类用户可能不期望的属性存在副作用,那么它应该是一种方法。

.NET Framework Design Guidelines本书非常详细地介绍了这类内容。