Как правильно определить свойства класса?

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

  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 для значения?

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

спасибо заранее

4 ответов


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

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;
        }
    }

}

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


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

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

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

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


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

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

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

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

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


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

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

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