Зачем использовать переменные-члены в классе
-
21-12-2019 - |
Вопрос
Я видел, что большинство людей используют переменные-члены в классе, подобном :
string _foo;
public string foo { get { return _foo; }; private set { _foo = value}; }
Но в чем разница между тем и этим?
public string foo { get; private set; }
Решение
в простых случаях, таких как это то же самое, но в более сложных случаях, когда вы огоньте события или что-то, что вам нужен дополнительный код в Get и Set, поэтому вам нужен элемент Ex:
private string _name;
public string Name
{
get{ return _name; }
set
{
SomeHandler("Name", value);
_name = value;
}
}
. Другие советы
Пока реализация свойства фактически ничего не делает, кроме получения и установки, разница довольно незначительна.Причинами для использования этого могут быть:
- Устаревший код до C # 3.0 (который добавил автоматические свойства, т.е.тот самый
public string Name { get; set; }
синтаксис. - Ожидая, что в какой-то момент придется изменить реализацию getter / setter.
- Требования для некоторой пользовательской сериализации.
- Использование базового поля в коде по какой-либо причине.Хорошим примером может быть использование поля backing в качестве
ref
параметр для некоторого метода.Это также включает в себя такие вещи, как использование значения в собственном взаимодействии (GCHandle
и т.д.). - Простые пользовательские настройки.Обычно я не использую автоматические свойства, потому что мне нравится указывать резервные поля вручную.
- Используя
readonly
резервное копирование поля невозможно при использовании автоматических свойств.
Это только верхушка айсберга.Есть также масса странных причин, скажем, необходимость явного объявления поля, чтобы кто-то мог получить к нему доступ с помощью отражения, по любой причине.
Перед введением «автоматических свойств» нам необходимо использовать некоторое «поле для поддержки» для пропортов.Большую часть времени пропорты просто вернут значение / установите значение на «поле для резервного копирования» как в приведенном ниже примере.
public string Name
{
get { return _name; }
set { _name=value; }
}
.
С введением «автоматических свойств» мы можем просто игнорировать «поле для поддержки» (или нам не нужно поставлять один).Это в основном подходит, если ваш дизайн похож на вышеприведенный пример, но если вам нужно обеспечить соблюдение какого-либо пользовательской логики, одновременно извлечение стоимости или перед установкой значения, нам все еще нужно следовать «хорошим старым дизайне» (т. Е.поле поддержки)
Различный сценарий дает различные преимущества.
string _FirsName;
string _LastName;
public string FullName
{
get
{
return _FirsName + _LastName;
}
set;
}
public string ReverseName
{
get
{
return _LastName + ", " + _FirsName;
}
set;
}
.