Метод vs Свойство в С# - какая разница

Возможный дубликат:
Свойства vs Методы

В методе вы можете ввести код и свойства. Например, у меня есть свойство Name. При изменении имени класса я хотел бы получить некоторые данные из базы данных и изменить состояние моего объекта. Я могу добавить этот код, чтобы установить часть моего свойства. Другим решением является изменение части набора на частный и добавление метода под названием SetName, и в этом методе добавьте мой код.

Так в чем же разница? Когда возникает вопрос, когда нехорошо поместить некоторый код в getter/setter и когда создать собственный метод, который используется для изменения моего свойства и других частей моего класса?

Ответ 1

Вот хороший набор рекомендаций для использования свойств vs методов из Bill Wagner (фиксированная ссылка)

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

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

Ответ 2

Учитывая такое свойство, как

private string _name;
public string Name { get { return _name; } set { _name = value; } }

можно написать следующие два метода:

public string get_Name() { return _name; }
public void set_Name(string value) { _name = value; }

которые действуют одинаково. И на самом деле это именно то, что делает компилятор для вас, когда вы создаете свойство.

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

Ответ 3

Свойство - не что иное, как синтаксический сахар. В некоторых случаях лучше определить свойство вместо метода, потому что оно более понятное/читаемое.

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

на самом деле, свойство реализуется как один или два метода; в зависимости от того, имеет ли ваша собственность сеттер или нет. Свойство преобразуется в метод get_xxx и set_xxx.

Ответ 4

Всякий раз, когда я сталкиваюсь с необходимостью вводить код в getter/setter, я помещаю код в частный метод и вызываю этот метод из getter/setter. Таким образом, код доступен в вызове метода, если он мне понадобится в другом месте. Не уверен, что это ответ, который вы искали, но это всего лишь методология, которую я использую.

Ответ 5

Подумав об этом, свойства - это не просто синтаксический сахар. Они являются публичным лицом ваших данных участника к вашему членскому коду.

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

DTO, например, представляет собой не что иное, как кучу хорошо написанных свойств, эффективно отлаживая данные и поведение. Без DTO вы могли бы представить себе плотное связывание DataGrid или Dropdown с сложным бизнес-логическим методом?

Положите это просто: методы на самом деле выполняют работу... Свойства запускают действие или получают статус.

Хотя вы можете использовать код метода внутри своих свойств... это не то, для чего они предназначены. Даже если вам нужно сделать чистый вызов другого метода внутри свойства, а не писать в нем свой код. НТН!

Ответ 6

По существу свойство - это несколько методов - getProperty и setProperty. Это только соглашение/упрощение вещи.

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

Ответ 7

Это, вероятно, не самая важная разница, но одно из отличий заключается в том, что отладчик может быть настроен для перехода по свойствам (при условии, что их код тривиален).

Ответ 8

В основном нет разницы (кроме зарезервированного идентификатора "значение" в сеттере).

Getters и seters внутренне переводится в стандартные методы, так что среда выполнения не имеет понятия, связан ли какой-либо getter или setter с определенным свойством. Термин синтаксический сахар часто используется для удобных конструкций, подобных этим.

Тем не менее, есть важное преимущество в разработке программного обеспечения: ваш код, как правило, проще понять, если вы ограничиваете себя использованием геттеров и сеттеров с помощью get и set semantics. То есть выполните только шаги, необходимые для обеспечения соответствующего имущества.

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

Как правило, вы не должны вводить какой-либо код в getter, у которого есть побочные эффекты. Кроме того, единственным побочным эффектом, который должен иметь код в сеттере, является изменение состояния в объекте, на который ссылается установщик.

Ответ 9

Способы делают что-то. Вот почему обычно у них есть глаголы в именах.

Пока свойство возвращает данные.

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

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