Подтвердить что ты не робот

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

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

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

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

Однако, продолжая изучать и читать больше о С# 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; }
        }
    }

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

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

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

4b9b3361

Ответ 1

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

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

- это Автореализованные свойства, введенные в С# 3.0. Ни один формат не является неправильным. Первый - это скорее "стенография".

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

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

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

}

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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