【问题标题】:"Tell, don't ask": what is the difference between a non-void method and a getter?“告诉,不要问”:非 void 方法和 getter 有什么区别?
【发布时间】:2011-01-06 12:19:09
【问题描述】:

在不使用任何属性获取器的情况下,我如何证明使用非 void 方法是合理的?这两个概念有什么区别,即 getter 是邪恶的,但非 void 方法是可以接受的?

编辑:

int CalculateSomething();

int Calculation { get; }

如果我想完全忘记,我可以更改CalculateSomething 的签名并将值传递给它。所以我的问题变成了:getter和非void方法的根本区别是参数可以传递给非void方法吗?

【问题讨论】:

  • 想发布一些代码吗?照原样,我无法做出正面或反面。
  • 我认为这里有一个真正的问题,所以不要投票结束。让我们给 OP 一点时间来澄清一下?
  • 我从未听说过吸气剂是邪恶的。如果没有 getter,一个封装良好的对象如何向系统描述自己?
  • @wheaties 如果吸气剂有副作用,人们可能会认为它是“邪恶的”。 getter 不应该修改对象的状态,延迟加载可能是个例外。修改 getter 只是不好的实现。吸气剂本身并不邪恶。
  • 来吧,伙计们!才20分钟。给 OP 一个机会!

标签: c# properties methods


【解决方案1】:

微软有guidance for choosing between properties and methods

  • 如果成员表示该类型的逻辑属性,请考虑使用属性。
  • 如果属性的值存储在进程内存中并且该属性仅提供对该值的访问,请使用属性而不是方法。
  • 在以下情况下,请使用方法而不是属性。
    • 操作比字段集慢几个数量级。如果您甚至考虑提供操作的异步版本以避免阻塞线程,那么该操作很可能过于昂贵而不能成为属性。特别是,访问网络或文件系统(初始化一次除外)的操作很可能是方法,而不是属性。
    • 操作是一种转换,比如Object.ToString方法。
    • 每次调用该操作都会返回不同的结果,即使参数不变。例如,NewGuid 方法每次调用都会返回不同的值。
    • 该操作具有显着且可观察到的副作用。请注意,填充内部缓存通常不会被视为可观察到的副作用。
    • 该操作返回内部状态的副本(这不包括堆栈上返回的值类型对象的副本)。
    • 该操作返回一个数组。

【讨论】:

  • 微软的一些观点可以得到更好的澄清。像Guid.NewGuid() 这样的东西的副作用是故意导致将来对Guid.NewGuid() 的调用以其他函数调用不会的方式返回不同的值,而像“DateTime.Now”这样的东西不会(后者需要执行时间可能会影响未来对DateTime.Now 的调用,但与执行相同时间的任何其他函数没有任何不同)。至于最后两点,我将两者合并为“操作返回一个新的对象实例”。
【解决方案2】:

你不能将变量传递给getter,这不是很大的区别吗?

一个函数:

private int Getyear(datetime date) { }

一个属性:

private DateTime GetDate {
    get {return _date};
}

你不能用 getter 属性做到这一点吗?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2017-12-05
  • 2012-08-09
相关资源
最近更新 更多