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

Какая разница между prop и полным свойством?

Привет, ребята, есть ли разница между двумя фрагментами кода ниже? Или верхняя только короткая форма нижнего?

public string Name{get;set;}

и

 private string _Name;
        public string Name
        {
            get { return _Name; }
            set { _Name=value;  }
        }
4b9b3361

Ответ 1

Единственное отличие (кроме того, что вам нужно было бы выполнить инициализацию с именем "По умолчанию" в вашем конструкторе класса) является то, что _Name будет видимым внутри самого класса. Существует риск того, что класс будет внутренне ссылаться на _Name, а не на Name, все будет работать нормально, а в какой-то более поздний момент вы добавите некоторую логику в Name, которая не будет вызвана, потому что вы используете _Name внутри класса.

Пример:

private string _Name = "Default Name";
public string Name
{
   get { return _Name.Left(42); }  // Changed the getter
   set { _Name = value; }
}

void MyOtherMethod()
{
   string foo = _Name; // Referencing the private field accidentally instead of the public property.
   // Do something with foo
}

Ответ 2

Я не думаю, что есть какая-то разница в скомпилированном коде. Причина, по которой вы, возможно, захотите сделать полный путь, - это, если вы хотите добавить значение по умолчанию (которое может быть сделано в конструкторе в короткой форме) или добавить дополнительный код в getter или setter

EDIT: На самом деле ваш код неправильный, он должен быть

private string _Name;
public string Name
{
   get { return _Name; }
   set { _Name = value; }//change here
}

не...

value = _Name;

Ответ 3

Основное поведение и назначение обоих методов свойств почти одинаковы. Но главное отличие в реализации. Разница между

public string Name{get;set;}

и

 private string _Name;
        public string Name
        {
            get { return _Name; }
            set { _Name=value;  }
        }

- если вы используете короткий синтаксис свойств (введенный в фреймворк 3.0 или новее), тогда свойство sting никогда не инициализируется, то есть если вы используете свойство Name только где угодно, не устанавливая значение для него, оно возвращает значение NULL. Но если вы используете второй синтаксис для инициализации значения свойства, он вернет строку EMPTY, потому что когда вы инициализируете строку, она инициализируется значением EMPTY, а не значением NULL. Поэтому, если вы вернете значение свойства без инициализации с использованием FULL Property Method, оно всегда будет возвращать строку EMPTY, а не значение NULL.

Ответ 4

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

Ответ 5

Для этой конкретной реализации второй формы оба эквивалентны. Поскольку компилятор будет генерировать почти тот же код, если вы просто напишете первую форму.

То есть компилятор собирается добавить к нему код:

public string Name{get;set;}

чтобы он выглядел следующим образом:

private string generatedCode_Name;
public string Name
{
      get { return generatedCode_Name; }
      set { generatedCode_Name = value; }
}

Кстати, это неверно

set { value = _Name; } //I believe its a typo!

Я думаю, вы имели в виду:

set {  _Name = value; }

Ответ 6

Одно отличие состоит в том, что вы можете установить значение по умолчанию в частной строке, когда вы это сделаете

private string _Name = "Default Name";
public string Name
{
   get { return _Name; }
   set { value = _Name; }
}

После компиляции два примера, которые вы показали, одинаковы.

Ответ 7

В качестве примера, написанного, они являются точным эквивалентом.

Автоматически внедренные свойства - это синтаксический сахар, введенный для адресации именно такого типа ситуации, где свойство используется только для того, чтобы избежать использования открытого поля, без дополнительной логики в приемнике/сеттере. Однако автоматически реализованное свойство дает вам все преимущества свойств, включая метаданные. Здесь довольно старая, но все же релевантная ссылка, которая объясняет немного больше о них.

За кулисами компилятор создает поле поддержки, очень похожее на ваше собственное.