Правильное использование Аксессоров

235
19 декабря 2017, 15:27

Хочу обратиться к данному элементу через другой класс:

public static string WinDir = (Environment.GetEnvironmentVariable("windir"));

Из видео-уроков по c# я понял что это не правильно.

Как лучше использовать свойства?

Так:

public static string WinDir {get;set;} = (Environment.GetEnvironmentVariable("windir"));

Или так:

public static string WinDir {get;private set;} = (Environment.GetEnvironmentVariable("windir"));

Меня интересуют последние 2 способа:

{get;set;} - Его же можно изменять из другого класса правильно?

А {get;private set;} - изменять нельзя, он только получит путь?!

Answer 1

Ну во-первых, мало толку от создания статической обертки над статическим методом из стандартной библиотеки, почему бы не использовать сразу Environment.GetEnvironmentVariable("windir") там где он нужен.

Во-вторых, (уж не знаю какая вероятность у этого, но) результат этого метода может меняться от вызова к вызову, поэтому не очень хорошо сохранять его и всегда использовать сохраненное значение, поэтому, опуская предыдущий абзац лучше уж написать что-то вроде:

public static string WinDir { get { return Environment.GetEnvironmentVariable("windir"); } }

или, в новых версиях языка, можно сократить до выражения:

public static string WinDir => Environment.GetEnvironmentVariable("windir");

Ну и, если не учитывать все вышеизложенное, у вас есть несколько путей:

Если функционал свойства не нужен (а в некоторых случаях от них нельзя уйти), то можно сделать readonly-поле:

public static readonly string WinDir = Environment.GetEnvironmentVariable("windir");

В новых версиях языка также появилась возможность создания свойств только для чтения без явного использования backing-field:

public static string WinDir { get; } = Environment.GetEnvironmentVariable("windir");

Что касается ваших вопросов:

{ get; set; } - да, это свойство может быть изменено снаружи и это вам, скорее всего, не нужно.

{ get; private set; } - это свойство может быть изменено только в коде этого класса, это уже лучше, но все равно вероятность ошибки есть.

READ ALSO
Интеграция R с C# и WPF

Интеграция R с C# и WPF

Не очень хорошо знаком с языком программирования RМожно ли сделать систему подобного плана?

157
Что значит «Строки в C# неизменяемы»?

Что значит «Строки в C# неизменяемы»?

Пытаюсь понять что значит «строки не «изменяемы»? И казалось бы в этой статье автор из кожи вон лез и все по полочкам расставил, но я не понялИ...

232
Windows Services и запуск функции по таймеру

Windows Services и запуск функции по таймеру

Пытаюсь написать службу которая каждую минуту будет записывать в файл фразу, предположим "Hello World" с новой строки

233
Проблема с сериализацией nullable type свойств

Проблема с сериализацией nullable type свойств

К проекту подключен внешний Service ReferenceСгенерированный код в Reference

204