2013-04-12 1 views
2

я продолжаю отскакивая назад и вперед, и хотел бы стандартизировать лучший:Инициализировать Частный объект в декларации или застройщике в C#

private MyOtherClass mc = new MyOtherClass(); // up here OK? 

public MyClass() 
{ 
    // or down here?, mc = new MyOtherClass(); 
} 

В какое время инициализации при объявлении происходит? Когда программа запускается?

+2

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

+0

В какое время? Инициализация происходит каждый раз, когда вы создаете новый экземпляр «MyClass», с выражением объекта 'new' типа' new MyClass() '. Сначала выполняются инициализации, написанные вместе с полями (инициализаторы полей), как если бы они составляли самые первые строки конструктора экземпляра. –

ответ

2

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

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

1

Либо это хорошо:. Это действительно вопрос предпочтений или как вы хотите организовать строительная логика.

Обратите внимание, что значение inline устанавливается первым, прежде чем запускается даже конструктор. То есть, следующие выходы bar:

public class MyClass 
{ 
    private string _member = "foo"; 
    public string Member { get { return _member; } } 

    public MyClass() 
    { 
     _member = "bar"; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var myClass = new MyClass(); 
     Console.WriteLine(myClass.Member); 
     Console.ReadLine(); 
    } 
} 
0

В вашем посте, вы спросили «В какое время инициализации при объявлении произойдет Когда программа запускается впервые?».

Другие ответы правильны, но я просто хотел бы подчеркнуть, что:

private MyOtherClass mc = new MyOtherClass(); 

объявляет поле экземпляра, и инициализируется, когда экземпляр экземпляра, не тогда, когда программа запускается.

Если вы объявляли статическое поле:

private static MyOtherClass mc = new MyOtherClass(); 

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

В любом случае это поле не инициализируется при запуске программы.

0

Я бы сказал: Это не имеет значения, где вы инициализируетесь, если это просто автономный класс. Когда этот класс станет базовым классом, в то время это может иметь значение. В частности, я говорю о порядке исполнения. Если вы хотите, чтобы ваша базовая инициализация была чем-то первым, переместите эту инициализацию в конструктор. Могут быть разные варианты последовательности выполнения в зависимости от того, как объявлены конструкторы и т. Д., Так что ответ есть, это может быть вопросом или может быть неважно. Определенно не имеет значения, если запечатанный класс. Но как только наследование связано, ответ неустойчив.

0

Оба способа в порядке. Для меня я устанавливаю следующее правило:

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

Если есть несколько способов инициализировать его, в зависимости от выбранного конструктора i инициализируется в корпусе конструктора.

public class SomeClass 
{ 
    private List<String> content = new List<String>(); 
    private String searchKey; 

    public SomeClass() 
    { 
     searchKey = String.Empty; 
    } 

    public SomeClass(String searchKey) 
    { 
     this.seachKey = searchKey; 
    } 

    // some more code 
} 

Наконец, чтобы ответить на ваш вопрос о моменте времени, когда вещи получить initilized:

  1. статических поля будут инициализированы при первом экземпляре класса строятся.

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

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