Какой смысл авто недвижимости?

Это может показаться наивным, но...

class Widget
{
    public int Foo { get; set; }
}

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

class Widget
{
    public int Foo;
}

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

Ответы

Ответ 1

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

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

Ответ 2

В дополнение к другим хорошим ответам, опубликованным до сих пор:

  • легко быстро создать свойство private-setter-public-getter, которое, вероятно, является лучшей практикой, чем общедоступное поле readonly для создания неизменяемого типа данных.

Ответ 3

  • Свойства
  • позволяют добавлять инкапсуляцию в класс Свойства
  • позволяют вашему доступу быть полиморфными (наследники могут изменять доступ, если свойство является виртуальным), если вы этого захотите.
  • Авто-свойства хороши, когда вы имеете дело с простыми операциями get/set. если вы выполняете более сложные операции внутри вашего get/set, вы не можете использовать авто-свойство.

также отражение не работает по-разному по свойствам, чем по переменным, но вы работаете с MemberInfo (FieldInfo, PropertyInfo или MethodInfo, какой вы выбираете).

Ответ 4

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

Ответ 5

Из msdn:

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

Вы можете сделать что-то вроде этого:

public class Date
{
private int month = 7;  // Backing store

public int Month
{
    get
    {
        return month;
    }
    set
    {
        if ((value > 0) && (value < 13))
        {
            month = value;
        }
    }
}
}

Проще говоря, свойства намного более универсальны.