Почему Stack.Peek() является методом?[закрыто]
Вопрос
Как в названии.Почему Куча классу нужен метод для возврата ссылки на верхний объект?Мне всегда говорили, что методы предполагают наличие каких-то вычислений и что вместо этого следует возвращать простые объекты со свойствами. Peek()
У метода нет параметров, и на уровне кода это (я думаю) простая операция.
Вопрос в том:есть ли для этого конкретная причина?Любое скрытое поведение, влияющее на производительность?
РЕДАКТИРОВАТЬ: Я не знаю реализацию класса, но, например.если метод использует перечислитель ниже, то многократное повторение последнего элемента было бы неразумно.С другой стороны, если это одиночный IList
, то это не должно оказывать большего влияния на производительность.
Решение
Peek — это глагол, поэтому в моей книге Peek()
должен быть методом.Однако с другим именем это также может быть собственность.
Помните, что любое свойство имеет связанные методы get и/или set, поэтому в любом случае у вас будет метод.
Другие советы
Я понимаю вопрос как «почему это метод, а не свойство».
Одна из причин может быть последовательность - все методы доступа на самом деле являются методами.Это совершенно вопрос в стиле, потому что не вижу причин не иметь его как свойство, с точки зрения чистого кода.
Документация не упоминает, что именно то, какая коллекция фактически используется для обработки стека, но в основном нет другого, более эффективного способа предоставить вам доступ только к «верхней» этой коллекции.Мы также не знаем, является ли «топ» даже первым или последним элементом, возможно, что стек держит отслеживание того, какой элемент является «верхним» и на самом деле не удаляет выскоченные элементы (по крайней мере, не каждый раз, когда онивыскочили) Во избежание необходимости перемещать каждый другой элемент (снова, предполагая, что они используют массив, подобные, а не связанные со структурой связанного списка).
Я бы сказал, что значение не является свойством самого генеракодицетагкода, но результат оценки текущего содержания стека, на мой взгляд, метод более подходит, чем свойство.
и как C. emothuis упоминает в Его ответ , Peek - это em>глагол , поэтому метод более логичен.И как PEEK - это общая терминология для этой операции на стеках, она имеет больше смысла использовать это, чтобы использовать новый / другой термин, просто для использования свойства.
Я согласен, может быть недвижимостью как генеракодицетагкод или что-то, потому что это делает интимиальный смысл, но он бросил бы исключение или возвращать NULL, если он пуст?Свойства не должны бросать исключения, в соответствии с MSDN .
from Справка источника стека , вы 'увидим код, связанный с определенным исключением.
// 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: http://en.wikipedia.org/wiki/encapsaStous_(object-oriented_programming)