Принудительная явная инициализация членов в конструкторе c # - PullRequest
3 голосов
/ 12 февраля 2009

Есть ли способ вызвать ошибку, если каждый конструктор не инициализирует данный элемент? Может быть, что-то с const?

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

Ответы [ 5 ]

3 голосов
/ 12 февраля 2009

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

1 голос
/ 12 февраля 2009

звучит как StyleCop может помочь
Конечно, вы должны создать свое собственное правило

1 голос
/ 12 февраля 2009

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

public class Foo
{
   private int val1;
   private List<int> list;

   public Foo()
   {
      //could also be a private constructor if that's appropriate
      //all default initialization
      val1 = 1;
      list = new List<int>();
   }

   public Foo(int nonDefaultValue1) : this()
   {
      //set inputted value
      val1 = nonDefaultValue1;
      //no need to initialize list, done by default constructor
   }
}
1 голос
/ 12 февраля 2009

Это поддерживается. Например:

  class Test {
    int notAssigned;
    void method() {
      // Use it, but don't initialize it
      int ix = notAssigned;
    }
  }

Производит:

предупреждение CS0649: Поле 'ConsoleApplication1.Test.notAssigned' никогда не назначается и всегда будет иметь значение по умолчанию 0

Чтобы превратить это в ошибку, используйте Project + Properties, вкладка Build, обрабатывать предупреждения как ошибки.

0 голосов
/ 12 февраля 2009

Совет: в Visual Studio научитесь использовать Shift + F12 (Найти все ссылки) Очень удобно находить ссылки на те, которые меняют состояние.

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