Собственно, вопрос: свойства(автосвойства) в c# это поведение или состояние объекта?
Определимся с терминологией:
Объект обладает состояние и поведение.(Гради Буч)
Подчеркну еще раз объект. Не тип, не класс(класс только описывает будущий объект), а объект.
Состояние объекта характеризуется перечнем (обычно статическим) всех свойств данного объекта и текущими (обычно динамическими) значениями каждого из этих свойств.(см. ссылку в пункте №1)
Поведение - это то, как объект действует и реагирует; поведение выражается в терминах состояния объекта и передачи сообщений. Иными словами, поведение объекта - это его наблюдаемая и проверяемая извне деятельность.(см. ссылку в пункте №1)
Свойство — это член, предоставляющий гибкий механизм для чтения, записи или вычисления значения частного поля. Свойства можно использовать, как если бы они были членами общих данных, но фактически они представляют собой специальные методы, называемые методами доступа. Это позволяет легко получать доступ к данным и помогает повысить безопасность и гибкость методов. (ссылку на MSDN смотри внизу)
Свойства позволяют обращаться к методу в исходном тексте программы, используя упрощенный синтаксис.(Ссылка на Рихтера смотри внизу)
Осторожный подход к определению свойств. Лично мне свойства не нравятся, и я был бы рад, если бы их поддержку убрали из Microsoft .NET Framework и сопутствующих языков программирования. Причина в том, что свойства выглядят как поля, на самом деле являясь методами. Это по рождает массу заблуждений и непонимания. Столкнувшись с кодом, обращающимся к полю, разработчик привычно предполагает наличие массы условий, которые просто не всегда верны, если речь идет о свойстве. (Ссылка на Рихтера смотри внизу)
А теперь разберемся, что к чему. Пример из того же Рихтера глава 9.
public sealed class Employee
{
private String m_Name; // Это состояние
private Int32 m_Age; // Это состояние
public String GetName() // Это поведение
{
return(m_Name);
}
public void SetName(String value) // Это поведение
{
m_Name = value;
}
Равносилен этому примеру из той же главы (Рихтер об это сам и говорит):
public sealed class Employee
{
private String m_Name; // Это состояние
private Int32 m_Age; // Это состояние
public String Name // Это поведение
{
get { return(m_Name); }
set { m_Name = value; }
}
}
Тут уже становится ясно что свойства это механизм доступа к закрытым полям, который осуществляется через методы. А значит, что Свойства это поведение. Рихтер как раз и критикует свойства, за то что они похожи на поля, а на самом деле это методы (которые предоставляет доступ к закрытым полям). Рихтер вообще предлагает убрать свойства, дабы избежать путаницы (в книге он рассматривает проблему со свойствами с другой стороны, но это еще одна грань проблем связаны с свойствами).
И, по-поводу свойства в интерфейсах, они помечаются как abstract, и выглядят примерно так:
public abstract String GetName();
public abstract void SetName(String value);
Это просто голые методы без реализации. Они не могут быть ни состояние, ни поведение, так как только ОБЪЕКТ может иметь состояние и поведение. Экземпляр интерфейса и абстрактного класса нельзя создать, по этому к ним применение понятия состояния и поведения невозможно.
Ссылки:
I. Ссылка на MSDN (Определение свойства).
II. Ссылка на Рихтера (Определение свойства, 9 глава стр. 204 по книге).
Это фича языка / компилятора, которая генерирует одновременно поле класа (которое хранят состояние) и свойство в виде метаданных + двух методов доступа к этому свойству (поведение).
UP на основе комментариев от топикастера:
C# использует похожий синтаксис для объявления обычных свойств в интерфейсах и auto-implemented свойств в классах. Несмотря на схожий синтаксис, результат отличается.
В классах auto-implemented свойства задают одновременно и состояние, и поведение:
class SomeClass
{
// компилятор создаст приватное поле + пару методов для доступа к нему
int MyProperty { get; set; }
}
В интерфейсах свойства объявляются без тел геттеров и сеттеров - т.к. тела этих методов являются реализацией поведения, а C# не поддерживает включение реализации в интерфейс:
interface ISomeInterface
{
// компилятор не создаст ни полей, ни методов
int MyProperty { get; set; }
}
Такое свойство может быть реализовано классом как угодно, в том числе в виде полной реализации get и set:
public class Class1 : ISomeInterface
{
int _myField;
public int MyProperty
{
get
{
return _myField;
}
set
{
_myField = value;
}
}
}
Обычный синтаксический сахар. Тоже что и лямба выражения (анонимные функции)
. Тоже что и Expression bodied functions
(=>), и async/await
, и Tuple
.
Этот сладкий, помогает очень сильно сократить код.
P.S: никто не мешает тебе написать:
private string _name;
public string Name
{
//здесь тоже сахар
get=> _name;
set=> _name = value;
}
или так:
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть следующая задача: На серверной стороне в памяти хранится двумерный массив размерностью 10 000 на 10 000 элементовПриходит запрос от клиента:...
Подскажите почему C# (winforms) Win10 записывает значение в ветку HKEY_LOCAL_MACHINE\SYSTEM\VritualRoot\USER\S-1-5-21--1001\HelloKey вместо ожидаемого HKEY_CURRENT_USER\HelloKey
по моему очень важно, без скобках цикл не бывает