Публичные члены против конструктора класса в C #? - PullRequest
3 голосов
/ 28 марта 2012

У меня есть сомнения.

1. namespace JIMS.ViewModel.Stock
2. {
3.     internal class StockGroupViewModel : JIMS.ViewModel.BaseViewModel
4.     {
5.         JIMSEntities dbContext = new JIMSEntities();
6. 
7.         public StockGroupViewModel()
8.         {                     
9.          dbContext = new JIMSEntities();
10.        }
11.    }
12. }

У меня есть этот класс. И я хочу знать, что называется первым. когда я создаю экземпляр этого класса

StockGroupViewModel s = new StockGroupViewModel();

Line 5 or Line 9.

Ответы [ 4 ]

12 голосов
/ 28 марта 2012

Строка 5 - это инициализатор поля, который выполняется перед любым кодом в конструкторе.

Из спецификации:

10.5.5.2 Инициализация поля экземпляра

Инициализаторы переменных поля экземпляра класса соответствуют последовательности присваиваний, которые выполняются сразу после входа в любой экземпляр конструкторы (§10.11.1) этого класса . Инициализаторы переменных выполняется в текстовом порядке, в котором они появляются в классе декларация. Процесс создания и инициализации экземпляра класса описано далее в §10.11.

2 голосов
/ 28 марта 2012

Инициализаторы полей, вызываемые до тела конструктора.Итак, строка 5 вызывается перед строкой 9.

1 голос
/ 28 марта 2012

Компилятор встроит инициализатор поля в код для конструктора, так что сначала вызывается и , а затем поле снова инициализируется вызовом в конструкторе.Взгляд на IL для кода делает это очень очевидным.

Например, такой код

class Foo
{
    StringBuilder sb = new StringBuilder(1);

    public Foo()
    {
        sb = new StringBuilder(2);
    }
}

выглядит так на уровне IL

.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
    .maxstack 8
    L_0000: ldarg.0 
    L_0001: ldc.i4.1  <-- ARGUMENT = 1
    L_0002: newobj instance void [mscorlib]System.Text.StringBuilder::.ctor(int32)
    L_0007: stfld class [mscorlib]System.Text.StringBuilder playground.Foo::o
    L_000c: ldarg.0 
    L_000d: call instance void [mscorlib]System.Object::.ctor()
    L_0012: nop 
    L_0013: nop 
    L_0014: ldarg.0 
    L_0015: ldc.i4.2  <-- ARGUMENT = 2
    L_0016: newobj instance void [mscorlib]System.Text.StringBuilder::.ctor(int32)
    L_001b: stfld class [mscorlib]System.Text.StringBuilder playground.Foo::o
    L_0020: nop 
    L_0021: ret 
}
1 голос
/ 28 марта 2012

Строка 5, поля инициализируются до вызова конструктора.

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