Подтвердить что ты не робот

Когда использовать get; задавать; в С#

Я не понимаю, какая разница между инициализацией переменной, получая ее значение следующим образом:

 //define a local variable.
   int i;

   i= 0;
   Console.WriteLine(i);

и get; задавать; Использование:

public int i
{
   get;
   set;
}

i = 0;
Console.WriteLine(i);

Я прочитал несколько статей, но не понимаю, когда буду использовать его.

4b9b3361

Ответ 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 имеет два основных преимущества:

  1. Не влияя на значение базового класса, мы можем изменить значение переменной в производном классе, используя метод get и set.

Например:

class User
{

    private string name = "Suresh Dasari";
    public string Name
    {
     get
        {
            return name.ToUpper();

        }

        set
        {
       if (value == "Suresh")
             name = value;
       }
        }
    }
  1. Также мы можем проверить \Restriction\Raise the Events в разделе свойств набора значений.