Я просто думал об этом, и с тех пор, как .Net представила свойства, всегда есть ситуация, когда вы захотите оставить свой код как метод, который возвращает значение, а не свойство readonly.Должны ли все методы, у которых есть возвращаемое значение, свойство?
ответ
Нет, я рекомендовал бы взглянуть на Microsoft's Property Usage Guidlines:
библиотека классов дизайнеры часто должны выбирать между реализации члена класса как свойство или метод. В общие, методы представляют действия, а свойства представляют данные. Используйте следующие рекомендации, которые помогут вам выбрать .
- Использовать свойство, когда элемент является логическим элементом данных. В следующих объявлениях имя - это свойство , поскольку оно является логическим членом класса .
- Используйте метод, когда:
- операция представляет собой преобразование, например, Object.ToString.
- Операция достаточно дорогая, что вы хотите сообщить пользователю , что они должны рассмотреть результат кэширования .
- Получение значения свойства с использованием получателя доступа будет иметь наблюдаемый побочный эффект .
- Вызов члена дважды подряд дает разные результаты.
- Порядок выполнения очень важен. Обратите внимание, что свойства типа должны быть установлены и извлечены в любом порядке.
- Элемент является статическим, но возвращает значение, которое можно изменить.
- Элемент возвращает массив. Свойства, возвращающие массивы, могут быть очень вводящими в заблуждение. Обычно требуется вернуть копию внутреннего массива , чтобы пользователь не мог изменить внутреннее состояние . Это связано с с тем, что пользователь может легко предположить, что это индексированное свойство, приводит к неэффективному коду. В следующем примере кода каждый вызов свойства Method создает копию массива . В результате 2n + 1 копии массив будет создан в следующем цикле .
Если это бесступенчатый метод, то стоит с учетом, переход на недвижимость, да. Если он просто возвращает частную переменную-член, то это определенно должно быть свойство.
Но в общем случае нет, не каждый метод, возвращающий значение, должен быть свойством. Некоторые методы создают объекты и возвращают их, и они должны быть никогда не быть свойствами. Некоторые методы возвращают this
, что позволяет использовать «Свободный» API. Ни одно из них не должно быть свойствами.
Нет, они не должны.
No Методы, возвращающие что-либо и выполняющие дорогостоящие операции, не должны быть изменены, например, в свойство.
Методы, которые принимают параметры, не могут быть преобразованы в свойство.
Методы, возвращающие массивы, не должны быть преобразованы в свойство, например. Это потому, что в таких случаях вы должны вернуть копию массива, чтобы запретить кому-то изменять массив вне класса. При использовании свойства, которое возвращает копию массива, то программисты, скорее всего, чтобы написать что-то вроде этого:
foreach(var x in myClass.PropertyThatReturnsArray)
{
}
Для каждой итерации, будет создана новая копия массива. Вместо этого, если вы написали это как метод, программисты более вероятно написать это:
var foo = myClass.GetTheArray();
foreach(var x in foo)
{
}
(Это правило, которое было исполнено по FxCop: http://msdn.microsoft.com/en-us/library/0fss9skc(VS.80).aspx).
Это психологическая вещь. :)
@Frederik. Я бы почти все же предположил, что это собственность. Я сделал это несколько раз, но в документации я утверждаю, что это копия коллекции. Я думаю о классе коллекции, который .Net имеет, например, словарь, оба ключа и значения отображаются как свойства. Спасибо за ваши комментарии. – uriDium
@Frederik. Вы ошибаетесь в этом, создавая новый экземпляр вашего массива для каждого прохода инструкции 'foreach'. Система создает конечный автомат и только получает значение свойства один раз. –
См. Мой ответ на http://stackoverflow.com/questions/2447559/c-does-function-get-called-for-each-iteration-of-a-foreach-loop/2447646#2447646, чтобы увидеть, как 'foreach 'работает внутри. –
- 1. Должны ли все методы возвращать значимое значение?
- 2. Должны ли все программы иметь возвращаемое значение?
- 3. У конструктора, связанного с новым, все еще есть возвращаемое значение
- 4. Найти все страницы, у которых есть родитель
- 5. Есть ли у Erlang методы?
- 6. У std :: cout есть возвращаемое значение?
- 7. Найти NSManagedObjects из NSArray, у которых есть свойство
- 8. Как запросить все компоненты ExtJS, у которых есть опция конфигурации
- 9. Должны ли все методы JNI быть статическими?
- 10. Есть ли у подклассов все свойства и методы родительского класса?
- 11. Как запросить узлы, у которых есть свойство версии с Cypher?
- 12. Jquery выберите все элементы, у которых есть ключ доступа
- 13. найти все словари, у которых есть неопределенное количество определенных ключей
- 14. Найти только записи, у которых есть все удаленные ассоциации
- 15. Есть ли такие процессоры, у которых есть инструкции обходить кеш?
- 16. Есть ли у python общие методы?
- 17. Должны ли все методы класса использовать все зависимости?
- 18. Есть ли способ заменить возвращаемое значение?
- 19. Есть ли способ подстроить значение, возвращаемое toShortString()?
- 20. Есть ли способ перебрать возвращаемое значение np.where? (?)
- 21. Проверьте, есть ли у объекта свойство
- 22. Как получить все бобы, у которых есть аннотация @Entity?
- 23. Выберите все элементы внутри родителя, у которых есть изображения
- 24. Как получить все объекты, у которых есть дочерние объекты
- 25. Выберите переменные символов, у которых есть все отсутствующие значения
- 26. querySelectorAll - получить ВСЕ теги, у которых есть набор атрибутов?
- 27. Найти все записи, у которых есть поле, отличное от нуля?
- 28. Laravel получить все записи, у которых есть категория
- 29. Удалить все документы из Solr, у которых есть пустое поле
- 30. Подсчитайте все проверенные CheckBox в ListView, у которых есть подкачка
+1 для ссылки на слово бога по проблеме. :) – Randolpho
Спасибо. Блестящий. – uriDium
Я бы сначала прочитал «Руководства по дизайну для разработчиков библиотеки классов» за несколько лет назад.Чистая 1,1 дня. Это очень полезная ссылка, чтобы прочитать обложку для покрытия и сохранить в заднем кармане. –