2013-09-13 2 views
3

В чем разница между двумя вариантами классов POCO?Свойства C#, в чем разница между этими двумя реализациями?

class Test 
    { 
     int _var1; 
     string _var2; 

     public int var1 
     { 
      get 
      { 
       return _var1; 
      } 
      set 
      { 
       _var1 = value; 
      } 
     } 

     public string var2 
     { 
      get 
      { 
       return _var2; 
      } 
      set 
      { 
       _var2 = value; 
      } 
     } 
    } 

и

class Test2 
    { 
     int _var1; 
     string _var2; 

     public int var1 
     { 
      get; 
      set; 
     } 

     public string var2 
     { 
      get; 
      set; 
     } 
    } 
+0

Обратите внимание, что вы можете поставить модификаторы ко второму примеру, как 'частный набор;' сделать это добытчик свойство для внешнего мира. – Silvermind

ответ

6

Первый - это реализация регулярного свойства с использованием поля поддержки, второе - auto-implemented properties, и поля не будут использоваться, поскольку компилятор будет генерировать поля поддержки для вас.

Авто-реализованные свойства избавляют вас от необходимости писать поля поддержки и код шаблона для доступа к ним, компилятор создает C# -неменные резервные поля в IL, которые не будут сталкиваться с другими именами полей в классе.

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

1

Вторая реализация называется Auto-Properties, которая была введена функция в рамках 3.0.

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

См. Это link для примера авто-свойств. Под капотом авто-свойства будут создавать поля поддержки для вас.

Посмотрите также на эту ссылку, для arguments against their use.

1

Вы можете получить доступ к основанию непосредственно в первой реализации.

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

1

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

Во-первых, вы возвращаете экземпляры ваших личных переменных, используя свойства.

Во втором компилятор генерирует поля и обрабатывает их назначение за кулисами, поэтому вам не нужно явно их объявлять.

2

Функциональные возможности не имеют разницы. Компилятор будет генерировать первую версию с 2-го.

0

Во втором случае компилятор автоматически добавит вам поле и обернет его. Это в основном эквивалентно тому, как это делать с помощью поля поддержки.

Смежные вопросы