Что такое разница между проп и полной собственностью? - PullRequest
14 голосов
/ 15 сентября 2011

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

public string Name{get;set;}

и

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

Ответы [ 7 ]

10 голосов
/ 15 сентября 2011

Единственное отличие (кроме того факта, что вам придется выполнять инициализацию с помощью «Имя по умолчанию» в конструкторе вашего класса) заключается в том, что _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
}
3 голосов
/ 29 февраля 2012

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

public string Name{get;set;}

И

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

состоит в том, что если вы используете короткий синтаксис свойства (введенный в framework 3.0 или более поздней версии), то свойство sting никогда не инициализируется, т.е.Свойство «Имя» в любом месте без установки значения вернет значение NULL.Но если вы используете второй синтаксис для инициализации значения свойства, он вернет строку EMPTY, потому что когда вы инициализируете строку, она инициализируется значением EMPTY, а не NULL.Поэтому, если вы возвращаете значение свойства без инициализации, используя метод свойства FULL, он всегда будет возвращать строку ПУСТО, а не значение NULL.

3 голосов
/ 15 сентября 2011

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

РЕДАКТИРОВАТЬ: На самом деле, ваш код не так, он должен быть

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

не ...

value = _Name;
1 голос
/ 15 сентября 2011

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

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

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

1 голос
/ 15 сентября 2011

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

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

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; }
1 голос
/ 15 сентября 2011

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

0 голосов
/ 15 сентября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...