Как правильно определить свойства класса? - PullRequest
12 голосов
/ 09 июля 2010

При определении нового класса в проекте, каков правильный / лучший метод для этого?В прошлом я создавал классы, такие как:

  public class MyClass
  {
      public string FirstName  {get; set;}
      public string LastName  {get; set;}
  }

Обычно я использовал бы такой класс для создания коллекций в проекте.

Однако, как я продолжаю учитьсяи читайте больше о c # sharp. Я вижу примеры, в которых классы определяются как:

    class MyClass //not set to public
    {
        private string  _firstName; //first defined as fields
        private string _lastName;

        public string FirstName  // then defined as properties 
        {
            get { return  _firstName; }
            set { _firstName = value; }
        }
        public string LastName
        {
            get { return _lastName; }
            set { _lastName = value; }
        }
    }

Является ли первый подход неверным в определении или это принятая сокращенная версия в C #?Рекомендуется всегда сначала определять класс с закрытыми полями, а затем определять их как свойства, используя get / set to value?

Я спрашиваю, потому что я самоучка на C #, и я пытаюсь улучшить иа также лучше понять правильный подход к разработке, а в некоторых примерах и учебных пособиях просто излагаются подходы без четкого объяснения того, почему один подход предпочтительнее (или его следует применять) по сравнению с другим.1013 *

Ответы [ 4 ]

16 голосов
/ 09 июля 2010

Ваш первый пример:

public class MyClass
{
    public string FirstName  {get;  set;}
    public string LastName  {get;  set;}
}

специально Автоматически реализуемые свойства , представленные в c # 3.0.Ни один из форматов неверен.Первый - это скорее сокращение.

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

public class MyClass
{
    private Dictionary<int, List<string>> _someInternalDictionary;

    public int MyValuesCount
    {
        get
        {
            return _someInternalDictionary.Values.Count;
        }
    }

}

Грубый пример, но, надеюсь, вы поняли мою идею.

14 голосов
/ 09 июля 2010

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

До C # 3.0 единственный правильный способ определения свойств был с полями поддержки.

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

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

5 голосов
/ 09 июля 2010

Два ваших класса на практике идентичны по функциональности и возможностям.

Цель синтаксиса автоматических свойств (первый класс) в основном состоит в том, чтобы дать вам быстрый способ объявить то же самое, что и второй класс, который вы показываете.

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

Назначение синтаксиса автоматического свойства двойное: оно было частично добавлено для упрощения Linq, а частично добавлено для упрощения простого объявления свойств, а не открытых полей.

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

0 голосов
/ 10 июля 2010

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

public {ReturnType} MyProperty { {Access Modifier}get; {Access Modifier}set; }

И я предполагаю, что вы уже знаете Access Modifier.

...