2013-05-26 2 views
2

Нет, это не еще один вопрос о том, почему мы должны использовать свойства в C# :) Я хотел бы знать, что главное различие междуC# свойства использования

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

и

public string Name { get; set; } 

I знайте, что с введением .NET 3.0 вы можете использовать последнее, но я все еще нахожу фрагменты кода, которые используют первый.

Мне интересно узнать, какие (если есть) различия между ними в производительности (за исключением того, что я трачу впустую вдвое больше места), в стиле и как работает базовая реализация.

Хотелось бы узнать, каково ваше мнение и какой из них вы используете в своем коде.

Спасибо и счастливы кодировать!

ответ

9

Я знаю, что с введением .NET 3.0, вы можете использовать последний

Нет, это с введением C# 3. Вы можете нацелить .NET 2 и по-прежнему использовать автоматически реализованные свойства. Важно различать версию C#, которую вы используете, и версию .NET, на которую настроена таргетинг.

Но нет никакой существенной разницы между двумя используемыми вами фрагментами, за исключением того, что при использовании автоматически реализованного свойства ни один другой исходный код не имеет доступа к полю. Поле дается «невыразимое имя» (которое действительно в IL, но не в C#). (Когда вы используете свойство автоматического выполнения, компилятор также применяет атрибут [CompilerGenerated] к этому свойству, но это очень редко важно.)

Не существует разницы в производительности в любом случае или в памяти.

+0

+1 не знаю об использовании его в .NET 2. –

4

Как вы знаете, эта функция называется Auto-Implemented Properties

В C# 3.0 и более поздних версии, авто Реализуемого свойство делает свойство декларирования более кратким, когда никакой дополнительная логика не требуется в аксессорах собственности. Они также позволяют клиентскому коду создавать объекты . Когда вы объявляете свойство, как показано в следующем примере , компилятор создает частное, анонимное поле поддержки, которое может быть доступно только через get и set accessors.

От вас

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

В вашем случае нет никакой проблемы с различием и производительностью между ними. Потому что вы ничего не делаете (какая-либо проверка или т. Д.) При установке или извлечении значения.

В качестве подсказки вы можете установить точку останова в модификаторах set/get, но вы не можете установить в свойстве auto. Как еще один, вы должны определить поле (_name в вашем случае) в обычном свойстве.

+0

Ах, с тех пор они являются воплощениями Точно так же, почему некоторые люди все еще используют старое? –

+1

@EdoardoTygerDominici Я предполагаю, что вы можете установить точки останова, как сказал Сонер. Кроме того, если сеттер является приватным и класс неизменен, вы можете сделать базовое поле 'readonly'. –

+0

@EdoardoTygerDominici Как я уже сказал в своем ответе, люди могут захотеть выполнить некоторую проверку в свойствах setter или getter. Например 'get { if (_name> 0) return someInt; прочее return -1; } ' –

0

Они оба дадут вам тот же результат, но вы должны знать, что «ручная» реализация свойства позволяет вам контролировать, что установлено и что получено, что является основной идеей свойств , например:

private string _name; 
public string Name { 
    get { return _name; } 
    set { if(_name.Length > 3) _name = value; } 
} 

в то время как с «авто», реализованной недвижимости вы просто имея вырожденное свойство равнину:

public string Name { get; set; }