2010-05-19 2 views

ответ

10

Нет, я рекомендовал бы взглянуть на Microsoft's Property Usage Guidlines:

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

  • Использовать свойство, когда элемент является логическим элементом данных. В следующих объявлениях имя - это свойство , поскольку оно является логическим членом класса .
  • Используйте метод, когда:
    • операция представляет собой преобразование, например, Object.ToString.
    • Операция достаточно дорогая, что вы хотите сообщить пользователю , что они должны рассмотреть результат кэширования .
    • Получение значения свойства с использованием получателя доступа будет иметь наблюдаемый побочный эффект .
    • Вызов члена дважды подряд дает разные результаты.
    • Порядок выполнения очень важен. Обратите внимание, что свойства типа должны быть установлены и извлечены в любом порядке.
    • Элемент является статическим, но возвращает значение, которое можно изменить.
    • Элемент возвращает массив. Свойства, возвращающие массивы, могут быть очень вводящими в заблуждение. Обычно требуется вернуть копию внутреннего массива , чтобы пользователь не мог изменить внутреннее состояние . Это связано с с тем, что пользователь может легко предположить, что это индексированное свойство, приводит к неэффективному коду. В следующем примере кода каждый вызов свойства Method создает копию массива . В результате 2n + 1 копии массив будет создан в следующем цикле .
+0

+1 для ссылки на слово бога по проблеме. :) – Randolpho

+0

Спасибо. Блестящий. – uriDium

+1

Я бы сначала прочитал «Руководства по дизайну для разработчиков библиотеки классов» за несколько лет назад.Чистая 1,1 дня. Это очень полезная ссылка, чтобы прочитать обложку для покрытия и сохранить в заднем кармане. –

2

Если это бесступенчатый метод, то стоит с учетом, переход на недвижимость, да. Если он просто возвращает частную переменную-член, то это определенно должно быть свойство.

Но в общем случае нет, не каждый метод, возвращающий значение, должен быть свойством. Некоторые методы создают объекты и возвращают их, и они должны быть никогда не быть свойствами. Некоторые методы возвращают this, что позволяет использовать «Свободный» API. Ни одно из них не должно быть свойствами.

+0

Да извините, вы правы, я имел в виду без параметров. – uriDium

+1

@uriDium: Тогда, возможно, вы должны отредактировать свой вопрос. – Gorpik

+0

@ Gorpik. Но это меняет вопрос и заставляет Рэндольфо выглядеть идиотом, как не может прочитать вопрос. – uriDium

0

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).

Это психологическая вещь. :)

+0

@Frederik. Я бы почти все же предположил, что это собственность. Я сделал это несколько раз, но в документации я утверждаю, что это копия коллекции. Я думаю о классе коллекции, который .Net имеет, например, словарь, оба ключа и значения отображаются как свойства. Спасибо за ваши комментарии. – uriDium

+0

@Frederik. Вы ошибаетесь в этом, создавая новый экземпляр вашего массива для каждого прохода инструкции 'foreach'. Система создает конечный автомат и только получает значение свойства один раз. –

+0

См. Мой ответ на http://stackoverflow.com/questions/2447559/c-does-function-get-called-for-each-iteration-of-a-foreach-loop/2447646#2447646, чтобы увидеть, как 'foreach 'работает внутри. –

Смежные вопросы