公共成员与C#中的类的构造函数?

时间:2012-03-28 16:52:44

标签: c# .net wpf class constructor

我有疑问。

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 个答案:

答案 0 :(得分:12)

第5行 - 它是一个字段初始值设定项,它在构造函数中的任何代码之前执行。

来自规范:

  

10.5.5.2实例字段初始化

     

类的实例字段变量初始值设定项对应于一系列赋值   在进入任何一个实例后立即执行   该类的构造函数(第10.11.1节)。变量初始值设定项是   按照它们出现在课堂上的文字顺序执行   宣言。类实例创建和初始化过程是   在§10.11中进一步描述。

答案 1 :(得分:2)

字段初始值设定项在构造函数体之前调用。因此,第5行在第9行之前调用。

答案 2 :(得分:1)

第5行,在调用构造函数之前初始化字段。

答案 3 :(得分:1)

编译器会将字段初始值设定项嵌入到构造函数的代码中,因此首先调用然后,然后通过构造函数中的调用再次初始化字段。查看IL代码使得这非常明显。

E.g。像这样的代码

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 
}