何时使用属性而不是函数

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

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

string GetErrorLog() { return m_ErrorLog; } 

或者我可以

 string ErrorLog { get { return m_ErrorLog; } } 

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

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

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

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

  • 返回值将涉及重大的工作,即:将从数据库中提取,或者可能需要“时间”
  • 涉及到相当多的逻辑,无论是获取或设置值

另外,我build议您查看微软的“财产使用devise指南” 。 他们build议:

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

使用以下方法时:

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

这里是微软的指导方针:

select属性和方法

  • 如果成员表示该types的逻辑属性,则考虑使用属性。

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

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

    • 该操作比字段设置要慢几个数量级。 如果你甚至考虑提供一个asynchronous版本的操作来避免阻塞线程,那么这个操作很可能是一个非常昂贵的属性。 尤其是,访问networking或文件系统的操作(初始化之外的操作除外)最有可能是方法,而不是属性。

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

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

    • 手术有明显的可观察的副作用。 请注意,填充内部caching通常不被视为可观察的副作用。

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

    • 该操作返回一个数组。

当清楚语义是“从对象中获取一些价值”时,我使用属性。 然而,使用一种方法是一种很好的沟通方式,“这可能需要更多的努力才能返回”。

例如,一个集合可以有一个Count属性。 它合理地假定一个集合对象知道当前有多less项目,而实际上不必循环它们并对它们进行计数。

在这个假设的集合上可以有GetSum()方法,它返回所有保存的项目的总数。 集合只是一个简单的Sum属性,但通过使用一个方法,它传达了这个集合将不得不做一些真正的工作来获得答案的想法。

我永远不会使用一个属性,如果我可以影响多个领域 – 我总是会使用一个方法。

一般来说,我只是使用公共stringErrorLog {get; 私人设置 }语法的属性和使用方法的一切。

除了里德的回答,当财产只是一个getter像获取资源,如事件日志可能是。 我尝试只使用属性,当属性将是副作用免费。

如果一个属性中发生的事情不止一件事,那么它应该是一种方法。 例如,如果您的ErrorLog getter属性实际上正在读取文件,那么它应该是一个方法。 访问一个属性应该是快速的,如果它正在做很多的处理,它应该是一个方法。 如果访问属性的副作用是类的用户可能不期望,那么它应该可能是一种方法。

有一个.NET框架devise指南的书,详细介绍了这种东西。