2009-12-23 2 views
2

В свойствах C# do необходимо ссылаться на частные переменные-члены или я могу просто объявить свойства и использовать их непосредственно в коде класса?Основные свойства C#

Если первое является наилучшей практикой, значит, это исключает использование свойства C# short-hand? То есть

public string FirstName { get; set; } 
+0

Вы не должны раскрывать поля-члены, т. Е. Они должны быть закрытыми и должны быть обернуты свойствами, когда вам необходимо предоставить доступ к ним вне вашего класса. Это не означает, что свойство _every_ должно закрывать личное поле. –

ответ

27

Свойства, когда реализованы так:

public string FirstName { get; set; } 

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

private string firstName; 
public string FirstName { 
    get { return firstName; } 
    set { firstName = value; } 
} 

Там нет причин, чтобы не использовать автоматические свойства ({получить; набор;}). Предоставьте те же преимущества, что и ваша собственная переменная-член.

Кроме того, если позднее вы решите, что вам необходимо выполнить дополнительную обработку (например, если вы решите внедрить INotifyPropertyChanged в свой установщик свойств), вы можете добавить это без изменения общедоступного API, но вручную установить фоновое поле ,

+0

+1 Хорошее объяснение – jchapa

+4

Нет никакого преимущества перед созданием собственного тривиального свойства, но вы не можете сделать подлинно доступное только для чтения свойство (т.е. * no * setter, даже не личное), поддерживаемое переменной только для чтения, используя автоматически реализованные свойства :( –

+0

Очень правдоподобны. Есть причины использовать свойства вручную над автоматически реализованными (свойства только для чтения - одна из причин), но для многих применений авто-реквизиты очень приятные и гораздо приятнее вводить. –

0

Им не нужно ссылаться на частные переменные-члены. Вы можете использовать их непосредственно в классе.

2

Для доступа к частным полям вам не нужны свойства, но в целом считается лучшей практикой.

И вы можете использовать авто-свойства (короткую руку), пока вам не нужно добавлять дополнительные функции к свойству, например, к проверке. Изменение его на «реальное» свойство всегда является непрекращающимся изменением.

0

C# может ссылаться на отдельные переменные, как в:

public class A 
{ 
    private string _b; 

    public string B 
    { 
     get { return _b; } 
     set { _b = value; } 
    } 
} 

ГЭТ; набор; назначение - это автоматические свойства, которые при компиляции будут генерировать для вас приватную переменную, чтобы упростить настройку вашего кода.

0

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

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

0

Чтобы добавить к ответу Рида, внутри вашего кода (внутри самого класса) функции-члены должны придерживаться этого и фактически использовать свойство, а не фактический частный член. Например, если у вас это:

public string FirstName { get; set; } 

И ты странный метод, называемый общественный GetFirstLetter Char(), возвращаемой первую букву в имени человека вы хотели бы сделать это следующим образом:

public char GetFirstLetter() 
     { 
      return FirstName[0]; 
     } 

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

2

Свойства создана как этот

public String Caption{ get; set; } 

это будет скомпилирован как

[CompilerGenerated] 
private string <Caption>k__BackingField; 

public string Caption 
{ 
    [CompilerGenerated] 
    get 
    { 
     return this.<Caption>k__BackingField; 
    } 
    [CompilerGenerated] 
    set 
    { 
     this.<Caption>k__BackingField = value; 
    } 
} 

Приведенный выше код извлекается после компиляции с помощью отражателя инструмента.

0

если вы используете как

public string FirstName { get; set; } 

компилятор автоматически добавляет методы получения и установки для этой собственности automatically.it не плохая практика.

Вот доказательство

alt text http://img683.imageshack.us/img683/4945/getset.jpg

, если вы объявите

private string firstName; 
     public string FirstName 
     { 
      get { return firstName; } 
      set { firstName = value; } 
     } 

как этот также компилятор воспринимает как

alt text http://img683.imageshack.us/img683/4945/getset.jpg

поэтому его не исключается. .. :)

0

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

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