Когда использовать get; задавать; в С#
Я не понимаю, какая разница между инициализацией переменной, получая ее значение следующим образом:
//define a local variable.
int i;
i= 0;
Console.WriteLine(i);
и get; задавать; Использование:
public int i
{
get;
set;
}
i = 0;
Console.WriteLine(i);
Я прочитал несколько статей, но не понимаю, когда буду использовать его.
Ответы
Ответ 1
В принципе, в этом случае нет никакой разницы, из (многих) преимуществ использования свойства является возможность добавить События к вашему свойству, например:
public delegate void ChangedEventHandler(object sender, EventArgs e);
int m_i = 0;
public int i
{
get { return m_i; }
set { m_i = value; iChanged(self, null); }
}
public ChangedEventHandler iChanged;
Это позволяет узнать код, когда я был изменен (могут быть некоторые синтаксические ошибки, я не сосредоточился на С# через некоторое время, но идея похожа). Это чрезвычайно важно в winforms, так как это основной способ узнать, когда нажата кнопка (или подобное).
Кроме того, это позволяет использовать дополнительные функции в настройщике свойства, например. проверяя, находится ли он в определенном диапазоне, например:
int m_i = 0;
public int i {
get { return m_i; }
set { if (value > 10) throw new Exception("I cannot be greater than 10!"); m_i = value; }
}
Ответ 2
Если вы считаете, что в дальнейшем вам может понадобиться более сложный метод получения или установки, автоматический синтаксис свойств позволяет выполнить обновление без перекомпиляции всех вызывающих. Однако переход от поля (переменной-члена) к свойству является серьезным изменением.
Эрик Липперт обращается к теме. Дважды.
Ответ 3
Позволяет забыть свойства для второй... Реальный вопрос, который вы задаете (и вы даже не знаете), почему вам нужны свойства (или геттеры и сеттеры на некоторых других языках)?
Чтобы продвигать encapsulation.
Свойства просто предлагают более сильный синтаксис для геттеров и сеттеров, также как и для аксессуаров (и, действительно, свойство просто обертывает методы set() и get() под капотом).
В С# 3 команда С# придумала автоматические свойства, поскольку огромное количество свойств ничего не делает с переменными (без дополнительной логики), поэтому для этого сценария короткие свойства.
Ответ 4
Синтаксис, который вы описываете, известен как свойство auto.
Прежде чем синтаксис был введен в .NET 2.0, мы создали такое свойство:
int _myVar;
int MyVar
{
get { return _myVar; }
set { _myVar = value; }
}
.NET 2.0 представил сокращенный синтаксис, позволяющий компилятору автоматически создавать переменную поддержки (_myVar
в моем примере выше)
int MyVar
{
get;
set;
}
Ключевое различие между установкой переменной и таким свойством заключается в том, что мы можем контролировать получение и настройку свойства (только свойства для чтения или вызов функции всякий раз, когда значение задано для свойства).
Ответ 5
В принципе, он добавляет накладные расходы в обмен на возможность присоединения события. Кроме того, это добавляет сложности и многословия, что делает код более трудным для чтения. Если вам нужно добавить обработчики проверки, это будет аккуратный способ сделать это. В некоторых случаях. В большинстве случаев вы знаете (и хотите знать), где изменяется переменная (член). Если вы этого не сделаете, у вас возникнет проблема с управлением кодом, а не проблема с языком.
Идея о том, что все "объектно ориентированная" лучше, ложна. Большинство разработчиков это понимают. Я занимаюсь этой работой в течение 30 лет, и я могу сказать вам, что 98 раз из 100 - проще. Потратьте свои усилия на эффективные алгоритмы, которые не добавляют лишней сложности, и вы уйдете далеко и переживете тенденции.
Ответ 6
public int i {get ; set;}
создает свойство auto i
типа int
что мало для
private int _i;
public int i
{
get{ return _i;}
set{ _i = i}
}
Ответ 7
В основном это концепция объектно-ориентированного программирования.
когда вы используете int i; (Это рассматривается как поле, и это поле может быть внутренним использованием, а также может использоваться из внешнего текущего класса в зависимости от модификатора доступа. (Public, Private, Protected)
Теперь, когда вы используете get; задавать; это свойство класса. Он также может быть установлен из другого класса, но diffrence - это метод доступа, и он предоставляет другие функции, такие как уведомление об изменении свойств и все такое.
Использовать, если вы не хотите контролировать его, но если вы хотите контролировать, используйте свойство. Также вы можете получить и установить с публичными, частными и защищенными, которые также могут
обеспечивают более гибкий интерм захвата.
Ответ 8
Меня смутили термины accessor
, mutator
и property
, а также { get; set; }
, как будто это магический псевдоним улучшения по сравнению с созданием поля public
.
- accessor= метод для доступа к полю
private
(в С# оба getter/setter)
- мутатор= метод для изменения поля
private
(просто сеттер)
- свойство= такое же, как
accessor
в С#.
Чисто как:
private int myNumber;
public int MyNumber { get; set; }
они абсолютно бесполезны и служат версией кода шума для:
public int myNumber;
Если, однако, вы добавите некоторые проверки следующим образом:
private int myNumber;
public int MyNumber
{
get
{
return myNumber;
}
set
{
if (myNumber < 0)
throw new ArgumentOutOfRangeException;
myNumber = value;
}
}
... тогда они на самом деле служат обычному назначению получателя/сеттера.
Ответ 9
Это одна из концепций ООП.
Использование свойства Get\Set имеет два основных преимущества:
- Не влияя на значение базового класса, мы можем изменить значение переменной в производном классе, используя метод get и set.
Например:
class User
{
private string name = "Suresh Dasari";
public string Name
{
get
{
return name.ToUpper();
}
set
{
if (value == "Suresh")
name = value;
}
}
}
- Также мы можем проверить \Restriction\Raise the Events в разделе свойств набора значений.