Какой смысл авто недвижимости?
Это может показаться наивным, но...
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;
}
}
}
}
Проще говоря, свойства намного более универсальны.