C#

Как работают элементы доступа set и get в C#? Никак не могу понять их. Ответьте только по делу, не нужно писать ерунду

Запись(set) и чтение(get)
Алмаз Жумагелдиев
Алмаз Жумагелдиев
61 243
Лучший ответ
Ramil Agarzayev Браво, сэр Paho
Дмитрий Хроменко Camon, это и так понятно, как его использовать? Я этого не понимаю, для каких целей он нужен. Запись чего? string и int?
Это методы доступа к элементу класса. Для надежности кода часто полезно не давать прямого доступа к полю класса, к тому же в такие методы могут быть включены дополнительные действия, например, преобразование данных.
Это то же самое, что запись в глобальную переменную, только через посредника в виде сеттера метода. Грубо говоря:

public void setMyValue(string value) {
this.MyValue = value;
}

Только в более читаемой сокращенной записи. Нужно это для того, чтобы класс имел возможность контролировать любую попытку чтения или записи данных. В какой-то момент может возникнуть потребность в каких-то изменениях при записи или чтении, это лучше бесконтрольного доступа к данным.
Дмитрий Хроменко То нужно просто для того что бы получить доступ к какому либо private переменной из другого класса, в классе Main?
Другими словами я просто могу использовать private переменную в глобальном методе, а не использовать эти элементы доступа?
Запись(set) и чтение(get)
для wpf ты в любом случае должен будешь ими пользоваться, но и в winForm`е труда дописать {get; set; } не составит.
зато в любой момент сможешь добавить дополнительную обработку на эту переменную.

например ты создаешь свойство, которое хранить уровень громкости и хочешь ограничить его значение диапазоном от 0 до 100:
private int _volume = 70;
public int Volume { get => _volume; set => _volume = Math.Max(0, Math.Min(100, value)); }

или твой класс содержит несколько других классов, которые создаются длительное время, но при этом ты почти ни когда не задействуешь их все и не хочешь тратить время на их создание без необходимости:
private MyMegoClass _myMegoClassEx1;
private MyMegoClass _myMegoClassEx2;
private MyMegoClass _myMegoClassEx3;
public MyMegoClass MyMegoClassEx1 { get => _myMegoClassEx1 ??= new MyMegoClass(); }
public MyMegoClass MyMegoClassEx2 { get => _myMegoClassEx2 ??= new MyMegoClass(); }
public MyMegoClass MyMegoClassEx3 { get => _myMegoClassEx3 ??= new MyMegoClass(); }

а возможно ты захочешь чтобы пустая строка ни когда не была null:
private string _content = string.Empty;
public string Content { get => _content; set => _content = string.IsNullOrEmpty(value) ? string.Empty : value; }

или вообще отдельное свойство которое кажет есть ли содержимое в твоем контенте:
public static bool HasContent { get => Content.Any(); }

это дает гибкость без лишних строк строк кода на написание методов типо:
public object GetContent() {...}
public object SetContent(object value) {...}
хотя и их использование ни кто не запрещает. дело вкуса.
Sergey Spiridonov
Sergey Spiridonov
2 054