2010-08-11 2 views
2

Можно создать дубликат:
C# member variable initialization; best practice?C#: инициализирует переменную при объявлении, или в конструкторе

В C#, что лучше инициализировать переменную в момент объявления, или в пределах конструктор?

например.

public Foo{ 
    Bar b = new Bar(); 
    public Foo() { } 
} 

ИЛИ

public Foo{ 
    Bar b; 
    public Foo() { b = new Bar(); } 
} 
+1

Лучше для чего? – Oded

+0

Лучше по каким-либо причинам важно в программировании на C#. – CJ7

+0

Я предпочитаю пойти с вашей последней версией. Я думаю, что это объясняется самым читаемым способом, в какое время исполняются определенные фрагменты кода, и это легко позволяет мне взаимодействовать с поведением по умолчанию, указав новые конструкторы, которые могут или не могут вызвать конструктор без параметров. Добавляя это как комментарий, поскольку он не пытается ответить на какой путь * лучше * –

ответ

2

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

+0

Я не думаю, что приведенный пример представляет собой конкретную реализацию. – hamishtaplin

+0

@dr_tchock: Как вы можете быть так уверены? Может быть, он работает на фабрике FooBar? ;) –

0

Мне просто не нравится инициализировать члены экземпляра во время объявления, кроме констант. Это просто больно глазам, особенно если имена классов длинны. В противном случае, с точки зрения языка, это не большая разница.

+0

Включая локальные переменные? Я пытаюсь инициализировать локальные переменные в точке объявления настолько, насколько это возможно. Я нахожу, что это делает значение переменной clearer. –

+0

@Jon Не включая локальные переменные :) Я думаю, что автор просил членов класса, а не локальных переменных :) По крайней мере, это было мое впечатление. –

+0

Джон: Справедливости ради, Петар указал членов экземпляра. – Gabe

3

Ну, «лучше» зависит от ситуации.

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

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

0

Все зависит, конечно, но я просто хочу поместить инициализаторы там, где они имеют наибольший смысл. Иногда полезно размещать их с объявлениями участников; в других случаях полезно помещать их в конструктор.

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

Смежные вопросы