Я много читаю о свойствах и инкапсуляции, но не понимаю, когда мне следует использовать сокращенную запись кода для свойств и когда я могу использовать свойства на практике.
Ниже приведены некоторые примеры свойств и переменных.определение, которое я нашел и изменил.Я думаю, я правильно понимаю, как работает каждый из них, но я не вижу смысла использовать некоторые из них на практике.
class MyClass
{
//1 - read and write property short record
public string Name1 { get; set; } = "Name1 content";
//2 - variable instead of property from 1 ex.
public string Name2 = "Name2 content";
//3 - read and write property long record
private string _name3 = default(string);
public string Name3
{
get => _name3;
set => _name3 = value;
}
//4 - read and write property with checking of value
private string _name4 = default(string);
public string Name4
{
get
{
return _name4;
}
set
{
if (value.Length >= 3)
_name4 = value;
}
}
//5 - read only property short record
public string Name5 { get; } = "Name5 content";
//6 - read only variable
public static readonly string Name6 = "Name6 content";
//7 - read (public) and write (in class range) property
private string _name7 = default(string);
public MyClass(string n)
{
this._name7 = n;
}
public string Name7
{
get => _name4;
private set => _name7 = value;
}
}
Пример.1 В чем преимущество объявления свойств, в точности как это, вместо переменной (пример 2)?Я знаю, что свойства можно использовать в интерфейсах, а не в полях (переменных), но есть ли какое-то другое преимущество?
Пример.3 не имеет смысла для меня, но он представлен в большинстве примеров применения свойств.Это не обеспечивает (на мой взгляд) инкапсуляцию _name3, потому что каждое изменение Name3 (извне) вызывает изменение _name3 (в MyClass)
Пример.4 имеет смысл для меня.Но используются ли свойства на практике только для проверки условий ввода?Это можно сделать в конструкторах.
Пример.5 и отл.6 похожи на Ex.1 и отл.2. Если я хочу заблокировать возможность изменения значения Name5, я могу использовать переменную readonly вместо свойства (как в примере 6).
Пример7 - единственный пример использования свойств для инкапсуляции, который я обнаружил и изменил._name7 / Name7 можно установить снаружи только конструктором.Тогда я могу изменить его только из MyClass.
Не могли бы вы, кроме ответа на мои сомнения, привести несколько примеров наиболее распространенного практического использования свойств?