如标题所示。为什么Stack类需要一个方法来返回顶层对象的引用?我总是被告知,方法表明涉及一些计算,而简单的对象应该返回属性而不是。 Peek()
方法没有参数,在代码级别上(我认为)是一个简单的操作。
问题是:是否有特定原因?任何影响性能的隐藏行为?
编辑:我不知道类的实现,但是f.e.如果方法使用下面的枚举数,那么多次迭代到最后一个元素将是不明智的。另一方面,如果它是一个IList
,那么它不应该对性能产生更大的影响。
答案 0 :(得分:12)
Peek是一个动词,所以在我的书中Peek()
应该成为一种方法。但是,如果名称不同,它也可能是一个属性。
请记住,任何属性都有关联的get和/或set方法,所以你最终会得到一种方法。
答案 1 :(得分:6)
我理解这个问题为“为什么它是一种方法,而不是一种财产”。
一个原因可能是一致性 - 所有访问方法实际上都是方法。这完全是一个风格问题,因为从纯粹的代码角度来看,我认为没有理由不把它作为一个属性。
答案 2 :(得分:2)
文档没有提到究竟用于处理堆栈的集合,但基本上没有其他更有效的方法可以让您只访问该集合的“顶层”。我们也不知道“顶部”是否是第一个或最后一个元素,堆栈可能会跟踪哪个元素是“顶部”并且实际上并不删除弹出的成员(至少不是每次都是弹出)以避免必须移动每个其他元素(再次,假设他们使用的是类似数组而不是链接列表的结构)。
答案 3 :(得分:2)
我会说因为值不是Stack
本身的属性,而是评估堆栈当前内容的结果,在我看来,方法比属性更合适。
正如C. Evenhuis在his answer中提到的那样, Peek 是动词,所以方法更合乎逻辑。而peek是堆栈上此操作的常用术语,使用它然后使用新的/不同的术语来使用属性更有意义。
答案 4 :(得分:2)
我同意,可能是TopItem
之类的属性,因为它会产生初始意义,但它是否会抛出异常,如果为空则返回null?属性不应抛出异常,according to MSDN。
从Stack's source reference开始,您会看到引发特定异常的代码。
// Returns the top object on the stack without removing it. If the stack
// is empty, Peek throws an InvalidOperationException.
public virtual Object Peek() {
if (_size==0)
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_EmptyStack"));
Contract.EndContractBlock();
return _array[_size-1];
}
现在,这与处理上述财产概念的方式不同。所以一个与另一个相比。
编辑 - 添加了属性文档。而不是获胜的答案,而是提供有关其不属于财产的逻辑的进一步解释。
答案 5 :(得分:-1)
这是封装,其目的是限制对对象组件的访问:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)