Свойства против методов - PullRequest
118 голосов
/ 02 марта 2009

Быстрый вопрос: когда вы решили использовать свойства (в C #) и когда вы решили использовать методы?

Мы заняты этой дискуссией и нашли некоторые области, в которых можно спорить, следует ли нам использовать свойство или метод. Один из примеров:

public void SetLabel(string text)
{
    Label.Text = text;
}

В этом примере Label - это элемент управления на странице ASPX. Существует ли принцип, который может регулировать решение (в данном случае), делать ли это методом или свойством.

Я приму ответ, который является наиболее общим и всеобъемлющим, но также затрагивает приведенный мной пример.

Ответы [ 16 ]

125 голосов
/ 02 марта 2009

Из раздела Выбор между свойствами и методами раздела Руководства по проектированию для разработки библиотек классов:

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

50 голосов
/ 02 марта 2009

Да, если все, что вы делаете, это получение и настройка, используйте свойство.

Если вы делаете что-то сложное, что может повлиять на несколько элементов данных, метод является более подходящим. Или если ваш геттер принимает параметры или ваш сеттер принимает больше, чем параметр значения.

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

Они в значительной степени взаимозаменяемы, но свойство сигнализирует пользователю, что реализация является относительно "простой". Да, и синтаксис немного чище.

Вообще говоря, моя философия заключается в том, что если вы начинаете писать имя метода, которое начинается с get или set и принимает ноль или один параметр (соответственно), то это основной кандидат на свойство.

12 голосов
/ 02 марта 2009

Свойства - это способ ввода или извлечения данных из объекта. Они создают абстракцию над переменными или данными внутри класса. Они аналогичны геттерам и сеттерам в Java.

Методы инкапсулируют операцию.

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

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

В вашем примере кода я бы обернул его в свойство, если мне нужно получить доступ к нему вне класса, в котором он содержится:

public Label Title 
{
   get{ return titleLabel;}
   set{ titleLabel = value;}
}

Настройка текста:

Title.Text = "Properties vs Methods";

Если бы я только устанавливал свойство Text метки, я бы так и сделал:

public string Title 
{
   get{ return titleLabel.Text;}
   set{ titleLabel.Text = value;}
}

Настройка текста:

Title = "Properties vs Methods";
12 голосов
/ 02 марта 2009

Если вы устанавливаете фактическое свойство вашего объекта, тогда вы используете свойство.

Если вы выполняете задачу / функцию, тогда вы используете метод.

В вашем примере устанавливается определенное свойство.

Если, однако, ваша функция заключается в AppendToLabel, то вы будете использовать метод.

9 голосов
/ 29 июня 2009

При поиске по MSDN я нашел ссылку на Свойства по сравнению с методами , в которой приведены некоторые отличные рекомендации по созданию методов:

  • Операция представляет собой преобразование, например Object.ToString.
  • Операция достаточно дорогая, что вы хотите сообщить пользователь, что они должны рассмотреть кеширование результат.
  • Получение значения свойства с использованием метода доступа get будет иметь наблюдаемый побочный эффект.
  • Повторный вызов участника дважды приводит к разным результатам.
  • Порядок исполнения важен. Обратите внимание, что свойства типа должны быть в состоянии быть установленным и восстановленным в любом заказ.
  • Член является статическим, но возвращает значение, которое можно изменить.
  • Член возвращает массив. Свойства, которые возвращают массивы, могут быть очень вводит в заблуждение. Обычно это необходимо вернуть копию внутренний массив, так что пользователь не может изменить внутреннее состояние. Это вкупе с тем, что пользователь может легко Предположим, что это индексированное свойство, приводит к неэффективному коду.
9 голосов
/ 02 марта 2009

Симметрично свойства являются атрибутами ваших объектов. Методы - это поведение вашего объекта.

Метка является атрибутом, и имеет смысл сделать его свойством.

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

Автомобиль {Цвет, Модель, Марка}

У автомобиля есть атрибуты Color, Model и Brand, поэтому не имеет смысла иметь метод SetColor или SetModel, потому что по идее мы не просим Car установить собственный цвет.

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

8 голосов
/ 02 марта 2009

Нужно только взглянуть на само название ... «Недвижимость». Что это значит? Словарь определяет его по-разному, но в этом случае «существенный или отличительный признак или качество вещи» подходит лучше всего.

Подумайте о цели действия. Вы на самом деле изменяете или восстанавливаете «существенный или отличительный признак»? В вашем примере вы используете функцию для установки свойства текстового поля. Это глупо, не правда ли?

Свойства действительно являются функциями. Все они компилируются в getXXX () и setXXX (). Он просто скрывает их в синтаксическом сахаре, но это сахар, который придает смыслу смысл процесса.

Думайте о свойствах как атрибуты. У машины много атрибутов. Цвет, MPG, модель и т. Д. Не все свойства являются настраиваемыми, некоторые являются расчетными.

Между тем, Метод - это действие. GetColor должен быть свойством. GetFile () должен быть функцией. Еще одно практическое правило: если это не меняет состояние объекта, то это должна быть функция. Например, CalculatePiToNthDigit (n) должна быть функцией, потому что она фактически не изменяет состояние объекта Math, к которому она присоединена.

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

3 голосов
/ 04 октября 2013

Также большим плюсом для Properties является то, что значение свойства можно увидеть в Visual Studio во время отладки.

3 голосов
/ 02 марта 2009

Я использую свойства только для доступа к переменным, т.е. для получения и установки отдельных переменных или для получения и установки данных в элементах управления. Как только требуется / выполняется любая манипуляция с данными, я использую методы.

3 голосов
/ 02 марта 2009

Свойства должны быть просто заданы и получать один вкладыш. Что-нибудь еще, и это действительно должно быть перенесено в метод. Сложный код всегда должен быть в методах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...