为什么Stack.Peek()是一个方法?

时间:2014-02-25 13:47:29

标签: c# stack peek

如标题所示。为什么Stack类需要一个方法来返回顶层对象的引用?我总是被告知,方法表明涉及一些计算,而简单的对象应该返回属性而不是。 Peek()方法没有参数,在代码级别上(我认为)是一个简单的操作。

问题是:是否有特定原因?任何影响性能的隐藏行为?

编辑:我不知道类的实现,但是f.e.如果方法使用下面的枚举数,那么多次迭代到最后一个元素将是不明智的。另一方面,如果它是一个IList,那么它不应该对性能产生更大的影响。

6 个答案:

答案 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)