我有疑问。
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.
答案 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
}