Свойства vs Методы

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

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

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

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

Title.Text = "Properties vs Methods";

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

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

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

Title = "Properties vs Methods";

Ответ 5

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

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

Ответ 6

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

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

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

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

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

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

Ответ 7

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

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

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

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

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

Итак, если вы сопоставляете случай property/method с объектом реальной жизни или смотрите на него с точки зрения symantic view, ваше замешательство действительно исчезнет.

Ответ 8

Я предпочитаю использовать свойства для методов add/set с параметром 1. Если параметры больше, используйте методы.

Ответ 9

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

Ответ 10

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

Ответ 11

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

Ответ 12

Свойства действительно хороши, потому что они доступны в визуальном дизайнере визуальной студии, если у них есть доступ.

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

Все остальные методы являются предпочтительным способом.

Это не только семантика. Использование свойств неулокального старта, имеющего странность, возникает в визуальном дизайнере визуальной студии.

Например, я получил значение конфигурации внутри свойства класса. Класс конфигурации фактически открывает файл и запускает sql-запрос, чтобы получить значение этой конфигурации. Это вызвало проблемы в моем приложении, когда файл конфигурации был открыт и заблокирован самой визуальной студией, а не моим приложением, потому что он не только читал, но и записывал значение конфигурации (через метод setter). Чтобы исправить это, мне просто пришлось изменить его на метод.

Ответ 13

В целях дизайна свойства представляют данные или атрибуты объекта класса, а методы - действия или поведение объекта класса.

В .Net, мир есть другие последствия использования свойств:

  • Свойства используются в привязке данных, в то время как методы get_/set_ - нет.
  • Пользовательские свойства XML-сериализации как естественный механизм сериализации.
  • Доступ к свойствам осуществляется с помощью PropertyGrid контроль и стажер ICustomTypeDescriptor, который можно эффективно использовать, если вы пишете пользовательскую библиотеку.
  • Свойства управляются Атрибуты, можно разумно использовать его для разработки программных платформ с ориентацией сторон.

Неверные представления (IMHO) об использовании свойств:

  • Используется для отображения небольших вычислений: ControlDesigner.SelectionRules получает блок работает в 72 строки!!
  • Используется для отображения внутренних структур данных. Даже если свойство не сопоставляется с внутренним элементом данных, его можно использовать как свойство, если оно является атрибутом вашего класса. Viceversa, даже если его атрибут свойств вашего класса нецелесообразен, возвращать массив как элементы данных (вместо этого используются методы для возврата глубокой копии членов.)

В приведенном здесь примере это могло быть написано с большим деловым значением как:

public String Title
{
    set { Label.Text = text; }
}

Ответ 14

Вот хороший набор рекомендаций, когда использовать свойства против методов из Bill Wagner

  • Используйте свойство, когда все это верно: Геттеры должны быть простыми и, следовательно, вряд ли будут бросать исключения. Обратите внимание, что это означает, что доступ к сети (или базе данных) невозможен. Либо может выйти из строя, и поэтому будет генерировать исключение.
  • Они не должны иметь зависимости друг от друга. Обратите внимание, что это будет включать настройку одного свойства и его влияние на другое. (Например, установка свойства FirstName повлияла бы на свойство FullName, доступное только для чтения, которое скомпоновало свойства имени и имени, подразумевает такую ​​зависимость)
  • Они должны устанавливаться в любом порядке
  • Геттер не имеет наблюдаемого побочного эффекта. Примечание. Это руководство не исключает некоторые формы ленивой оценки в свойстве.
  • Метод должен всегда возвращаться немедленно. (Обратите внимание, что это исключает свойство, которое вызывает вызов доступа к базе данных, вызов веб-службы или другую аналогичную операцию).
  • Использовать метод, если элемент возвращает массив.
  • Повторные вызовы к получателю (без промежуточного кода) должны возвращать одинаковое значение.
  • Повторные вызовы сеттера (с одинаковым значением) не должны вызывать разницы между одним вызовом.

  • Get не должен возвращать ссылку на внутренние структуры данных (см. пункт 23). Метод может вернуть глубокую копию и может избежать этой проблемы.

* Взято из моего ответа на дублированный вопрос.

Ответ 15

Это просто

1: использовать свойство, когда вы хотите, чтобы ваши данные были проверены перед сохранением в поле. Таким образом, свойство обеспечивает инкапсуляцию для ваших полей. Потому что, если вы оставите свои поля, публичный конечный пользователь может назначить любое значение, которое может или не может быть действительным, согласно вашему бизнес-требованию, например, возраст должен быть больше 18. Поэтому, прежде чем значение сохранит соответствующее поле, нам нужно проверить его действительность. Таким образом, свойства представляют данные.

2: Используйте метод, когда вы хотите выполнить какое-то действие, например, вы предоставляете некоторые данные в качестве параметра, а ваш метод выполняет некоторую обработку на основе предоставленных значений и возвращает обработанное значение в качестве вывода. Или вы хотите изменить значение некоторого поля этим расчетом. "Таким образом, метод представляет действие".

Ответ 16

Я пришел из java, и я использовал get.. set.. method какое-то время.

Когда я пишу код, я не спрашиваю себя: "Доступ к этим данным прост или требует тяжелого процесса?" потому что все может измениться (сегодня восстановить это свойство просто, tomonrow может потребовать некоторый или тяжелый процесс).

Сегодня у меня есть метод SetAge (int age) tomonrow, у меня будет также метод SetAge (дата рождения), который вычисляет возраст, используя дату рождения.

Я был очень разочарован тем, что свойство преобразования компилятора в get и set, но не учитывает методы Get... и Set.. как же.