如标题所示。为什么 堆叠 类需要一个方法来返回顶部对象的引用?我一直被告知,方法建议涉及一些计算,并且应该用属性返回简单的对象。 Peek() 方法没有参数,在代码级别上它(我认为)是一个简单的操作。

问题是:这有什么特别的原因吗?任何影响性能的隐藏行为?

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

有帮助吗?

解决方案

Peek是一个动词,所以在我的书中 Peek() 应该 是一种方法。但是,使用不同的名称,它也可能是一个属性。

请记住,任何属性都关联了get和/或set方法,所以你最终都会得到一个方法。

其他提示

我把这个问题理解为"为什么它是一个方法,而不是一个属性"。

一个原因可能是一致性-所有访问方法实际上都是方法。这完全是一个问题,因为我认为没有理由不把它作为一个属性,从纯代码的角度来看。

文档并没有确切地提到实际用于处理堆栈的集合,但基本上没有其他更有效的方法可以让您只访问该集合的"顶部"。我们也不知道"顶部"是否是第一个或最后一个元素,堆栈可能会跟踪哪个元素是"顶部",并且不会实际删除弹出的成员(至少不是每次弹出时),以避免移动每个其他元素(同样,假设它们使用的是类似数组而不是类似链表的结构)。

我得说,因为这个值不是 Stack 本身,而是评估堆栈当前内容的结果,在我看来,方法比属性更适合。

而作为C。Evenhuis在 他的回答, 偷看,偷看 是一个 动词, ,所以一种方法更合乎逻辑。由于peek是堆栈上此操作的常用术语,因此使用它更有意义,然后使用新的/不同的术语来使用属性。

我同意,可能是一个财产 TopItem 或者是因为这使得intitial sense,但是如果为空,它会抛出异常或返回null吗?属性不应该抛出异常, 根据MSDN.

堆栈的源引用, ,您将看到引发特定异常的代码。

    // 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];
    }

这与上述属性概念的处理方式不同。所以一个对另一个。

编辑-添加属性文档。而不是获胜的答案,而是提供了关于为什么它不是财产的逻辑的进一步解释。

这是封装,它的目的是限制对对象组件的访问: http://en.wikipedia.org/wiki/Encapsulation_(面向对象的编程)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top