Есть ли какая-то польза от назначения свойств класса в конструкторе классов? - PullRequest
3 голосов
/ 04 января 2010

Например, если у меня есть такой класс:

namespace Sample
{
     public Class TestObject
     {
          private Object MyAwesomeObject = new MyAwesomeObject();
     }
}

Есть ли какая-либо выгода, чтобы настроить его так, чтобы свойство устанавливалось в конструкторе следующим образом?

namespace Sample
{
     public Class TestObject
     {
          private Object MyAwesomeObject;

          public TestObject()
          {
                MyAwesomeObject = new MyAwesomeObject()
          }
     }
}

Ответы [ 9 ]

10 голосов
/ 04 января 2010

Два (почти) идентичны.

При определении встроенного инициализатора:

private Object MyAwesomeObject = new MyAwesomeObject(); 

Это произойдет до кода конструктора класса. Это часто лучше, но имеет несколько ограничений.

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

Кроме того, когда вы устанавливаете значения в своих конструкторах, вы можете использовать данные вашего класса в статическом контексте, что невозможно сделать с помощью встроенных методов. Например, если вы хотите что-то инициализировать, используя дерево выражений, это часто нужно делать в конструкторе, поскольку дерево выражений находится в статическом контексте, который не будет иметь доступа к членам вашего класса во встроенном инициализаторе членов. 1010 *

4 голосов
/ 04 января 2010
  1. Упрощает пошаговую отладку

  2. Упрощает управление порядком вызова конструкторов

  3. Позволяет отправлять параметры конструкторам на основе некоторой логики или передаваться в качестве аргумента объекту, с которым вы работаете.

2 голосов
/ 05 января 2010

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

Вот моя статья на эту тему:

http://blogs.msdn.com/ericlippert/archive/2008/02/18/why-do-initializers-run-in-the-opposite-order-as-constructors-part-two.aspx

1 голос
/ 04 января 2010

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

1 голос
/ 04 января 2010

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

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

1 голос
/ 04 января 2010

В вашем конкретном примере нет преимущества.

Однако существует ленивое создание экземпляров, которое во многих случаях уменьшает объем памяти:

namespace Sample
{
     public Class TestObject
     {
          private Object m_MyAwesomeObject;

          public TestObject()
          {

          }

          public Object MyAwesomeObject
          {
              get
              {
                  if (m_MyAwesomeObject == null)
                      m_MyAwesomeObject = new Object();

                  return m_MyAwesomeObject;
              }
          }
     }
}
1 голос
/ 04 января 2010

Поля инициализируются немедленно перед конструктором для объекта Экземпляр называется. Если конструктор присваивает значение полю, оно будет перезаписать любое значение, указанное в поле декларация.

См. Поля (Руководство по программированию в C #) .

1 голос
/ 04 января 2010

Единственное преимущество в том, что вы можете быть немного более динамичным в конструкторе, где встроенная инициализация требует, чтобы вы использовали только статические значения для аргументов конструктора и тому подобное. Например, если MyAwesomeObject требуется значение из файла конфигурации, вам необходимо установить его в конструкторе

0 голосов
/ 04 января 2010

Как правило, наличие конструктора не по умолчанию гарантирует, что экземпляр находится в состоянии, отличном от состояния по умолчанию. Это также позволяет неизменным классам, которые имеют свои преимущества.

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