Конструкция свойств get-set генерирует скрытые (для синтаксиса) методы и поле
Например,
class Human
{
public string Name { get; set }
}
преобразуется на уровне компилятора в
class Human
{
private string _name;
public string GetName()
{
return this._name;
}
public void SetName(string value)
{
this._name = value;
}
}
Но get и set можно переопределять, но тогда поле не генерируется и надо самому определить (или использовать существующее, в зависимости от логики)
Например,
class Human
{
private string _phone;
public string Phone
{
get => "Human phone" + this._phone;
set =>
{
this._phone = value;
if (value[0] != '+') this._phone = "+" + this._phone;
}
}
}
Преобразуется в
class Human
{
private string _phone;
public string GetPhone()
{
return "Human phone: " + this._phone;
}
public void SetPhone(string value)
{
this._phone = value;
if (value[0] != '+') this._phone = "+" + this._phone;
}
}
Ну и обращения к свойствам в качестве полей заменяется на вызов метода
var human = new Human();
human.Name = "John";
Console.WriteLine(human.Name);
преобразуется в
Human human = new Human();
human.SetName("John");
Console.WriteLine(human.GetName());
А если не указать get или set, то соответственно не будет генерироваться метод на чтение или запись