问题是:是否有具体的原因?是否有任何隐藏的行为会影响性能?
编辑:我不知道类的实现方式,但是如果该方法在下面使用了枚举器,则多次迭代到最后一个元素是不明智的。另一方面,如果它是单个IList,则不应对性能产生任何更大的影响。
Peek是一个动词,所以在我的书中,Peek()
应该是一个方法。但是用不同的名称,它也可以是一个属性。
请记住,任何属性都有关联的get和/或set方法,所以无论如何,您最终都会得到一个方法。
我理解这个问题是“为什么它是一个方法而不是属性”。
其中一个原因可能是为了保持一致性 - 所有访问方法实际上都是方法。从纯粹的代码角度来看,我认为没有理由不将其作为属性,这完全是一种风格问题。
我同意,可以将其作为属性TopItem
或类似的内容,因为这样更容易理解,但如果为空,它会抛出异常还是返回null呢?根据MSDN的规定,属性不应该抛出异常。
从Stack的源代码参考中,您会看到涉及到抛出特定异常的代码。
// 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];
}
现在这与上述属性概念的处理方式不同。所以一个与另一个不同。
编辑-添加了属性文档。虽然不是获胜答案,但提供了更多关于为什么它不是属性的逻辑解释。
Nullable<T>.Value
中,因为它们只是表示程序员正在以不正确的方式使用属性(例如在错误的时间)。 - O. R. Mapper文档没有明确说明用哪个集合来处理栈,但基本上没有其他更有效的方法可以让您只访问该集合的“顶部”。我们也不知道“顶部”是第一个还是最后一个元素,可能栈会跟踪哪个元素是“顶部”,并且不会实际删除弹出的成员(至少不是每次弹出它们),以避免必须移动每个其他元素(再次假设它们正在使用类似数组而不是链表的结构)。
Peek()
方法能够获取“顶部”元素,则属性也可以使用完全相同的代码来执行此操作。 - decPL我认为,由于值不是 Stack
本身的属性,而是评估栈当前内容的结果,所以在我看来,方法比属性更合适。
正如C. Evenhuis在他的答案中提到的那样,Peek 是一个动词,因此使用方法更加符合逻辑。由于peek是对栈执行此操作的常用术语,因此使用peek比使用新/不同术语使用属性更有意义。
这是封装,它的目的是限制访问对象组件:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)。