Вопрос

Я видел, что большинство людей используют переменные-члены в классе, подобном :

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; 
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top