Как обычно назначать значения по умолчанию для переменных-членов в C #? - PullRequest
0 голосов
/ 20 июля 2009

Что более привычно в C #?

class Foo
{
  private string _first;
  private string _second;

  public Foo(string first)
  {
    _first = first;
    _second = string.Empty;
  }
}

или

class Foo
{
  private string _first;
  private string _second = string.Empty;

  public Foo(string first)
  {
    _first = first;
  }
}

Ответы [ 9 ]

2 голосов
/ 20 июля 2009

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

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

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

class Foo
{
    private Foo() { _second = SomeComplexCalculation(); }
    public Foo(string first) : this()
    {
       _first = first;
    }
}

Если порядок назначения имеет значение, тогда у меня будет частная функция, выполняющая инициализацию.

2 голосов
/ 20 июля 2009

Не знаю о соглашении, но более безопасный способ инициализирует членов, как во втором примере. Вы можете иметь несколько конструкторов и забыть выполнить init в одном из них.

0 голосов
/ 20 июля 2009

Передовой опыт Microsoft - инициализировать участников во время их объявления. Итак:

class Foo
{
  private string _first;
  private string _second = string.Empty;

  public Foo(string first)
  {
    _first = first;
  }
}

Был бы ответ здесь.

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

0 голосов
/ 20 июля 2009

Я использую ключевое слово по умолчанию .

// local variable
var x = default(Action);

// member variable
this.FieldX = default(Action);

Обновление: добавлена ​​ссылка на MSDN

0 голосов
/ 20 июля 2009

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

Но при использовании этого второго стиля компилятор C # генерирует одинаковые значения инициализации каждого поля в в каждом конструкторе , присутствующем в классе.

0 голосов
/ 20 июля 2009

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

private string _second = string.Empty;

Вместе со свойствами у меня есть конструкция, подобная следующей:

 public class Foo
 {

    public Foo(...)
    {
      ...
    }

    private string _Second = string.Emtpy;
    public string Second
    {
      get
      {
        return _Second;
      }
      set
      {
        _Second = value;
      }
    }

 }
0 голосов
/ 20 июля 2009

Второй способ имеет несколько преимуществ: во-первых, его легче читать, во-вторых, он более СУХОЙ, когда у вас более одного конструктора, вам не нужно вручную их цепочки или дублировать инициализацию, что приводит нас к третьему преимущество - меньше подвержено ошибкам.

0 голосов
/ 20 июля 2009

Я бы выбрал второй способ для примитивных типов (String, int и т. Д.).

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

0 голосов
/ 20 июля 2009

Мне нравится второй способ. Это выглядит более естественно.

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