Почему Stack.Peek() является методом?

Как в заголовке. Зачем классу Stack метод, возвращающий ссылку на верхний объект? Мне всегда говорили, что методы предполагают, что здесь есть какие-то вычисления, и что вместо этого простые объекты должны возвращаться со свойствами. Peek() Метод не имеет параметров и на уровне кода это (я думаю) простая операция.

Вопрос: есть ли для этого конкретная причина? Есть ли скрытое поведение, которое влияет на производительность?

РЕДАКТИРОВАТЬ: я не знаю реализацию класса, но если метод использует перечислитель внизу, то многократный переход к последнему элементу был бы неразумным. С другой стороны, если это один IList, то это не должно иметь большее влияние на производительность.

6 ответов

Решение

Peek это глагол, поэтому в моей книге Peek() должен быть метод. Однако с другим именем это также может быть свойство.

Помните, что с любым свойством связаны методы get и / или set, поэтому в любом случае вы получите метод.

Я понимаю вопрос как "Почему это метод, а не собственность".

Одной из причин может быть последовательность - все методы доступа на самом деле являются методами. Это полностью вопрос стиля, потому что я не вижу причин, чтобы не иметь его как свойство с точки зрения чистого кода.

В документации точно не указано, какая коллекция на самом деле используется для обработки стека, но в принципе нет другого, более эффективного способа предоставить вам доступ только к "вершине" этой коллекции. Мы также не знаем, является ли "top" хотя бы первым или последним элементом, возможно, стек отслеживает, какой элемент является "верхом", и фактически не удаляет добавленные элементы (по крайней мере, не каждый раз, когда они всплывают), чтобы избежать необходимости перемещать все остальные элементы (опять же, при условии, что они используют структуру, похожую на массив, а не на структуру, связанную со списком).

Я бы сказал, что значение не является собственностью Stack Сам по себе, но в результате оценки текущего содержимого стека, на мой взгляд, метод больше подходит, чем свойство.

И, как К. Эвенуис упоминает в своем ответе, Пик - это глагол, поэтому метод более логичен. И так как peek является общей терминологией для этих операций над стеками, имеет смысл использовать ее, а не использовать новый / другой термин просто для использования свойства.

Я согласен, может быть как собственность TopItem или что-то еще, потому что это имеет смысл, но может ли оно вызвать исключение или вернуть пустое значение? Свойства не должны бросать исключения, согласно 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];
    }

Теперь это отличается от того, как будет обрабатываться вышеуказанная концепция свойства. Так что один против другого.

edit- добавлена ​​документация по недвижимости. И не победный ответ, а предоставление дополнительного объяснения о логике, почему это не свойство.

Это инкапсуляция, ее целью является ограничение доступа к компонентам объектов: http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

Другие вопросы по тегам