c# - 在类声明与构造函数中初始化对象的区别
问题描述
我正在为我的对象进行对象初始化和构造函数初始化,但无法准确回答我的问题。这里的Case1和Case2有什么区别;
情况1:
namespace ConsoleApplication2
{
class MyBuilder
{
private MySynchronizer m_synchronizer = new MySynchronizer();
public MyBuilder()
{
}
public void ProcessRecord(int recordNumber)
{
m_synchronizer.Process(recordNumber);
}
}
}
案例二:
namespace ConsoleApplication2
{
class MyBuilder
{
private MySynchronizer m_synchronizer;
public MyBuilder()
{
m_synchronizer = new MySynchronizer();
}
public void ProcessRecord(int recordNumber)
{
m_synchronizer.Process(recordNumber);
}
}
}
这是显示我如何调用 Builder 类的示例代码;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Press any key to stop");
MyBuilder builder = new MyBuilder();
builder.ProcessRecord(2);
}
}
[对不起,如果我不能正确地改写问题,在这种情况下,任何人都可以提供其他 SO 文章的链接]
解决方案
这里的区别非常微妙,只能在 IL 中轻松理解:
class MyBuilder1
{
private MySynchronizer m_synchronizer = new MySynchronizer();
public MyBuilder1()
{
}
}
给了我们构造函数:
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
// Method begins at RVA 0x2050
// Code size 18 (0x12)
.maxstack 8
IL_0000: ldarg.0
IL_0001: newobj instance void MySynchronizer::.ctor()
IL_0006: stfld class MySynchronizer MyBuilder1::m_synchronizer
IL_000b: ldarg.0
IL_000c: call instance void [mscorlib]System.Object::.ctor()
IL_0011: ret
} // end of method MyBuilder1::.ctor
就像这样:
class MyBuilder2
{
private MySynchronizer m_synchronizer;
public MyBuilder2()
{
m_synchronizer = new MySynchronizer();
}
}
给我们:
// Methods
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
// Method begins at RVA 0x2063
// Code size 18 (0x12)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ldarg.0
IL_0007: newobj instance void MySynchronizer::.ctor()
IL_000c: stfld class MySynchronizer MyBuilder2::m_synchronizer
IL_0011: ret
} // end of method MyBuilder2::.ctor
区别只是订购之一:
- 字段初始值设定项 (
MyBuilder1
) 发生在基类型构造函数调用之前(object
这里是基类;call instance void [mscorlib]System.Object::.ctor()
是基类构造函数调用) - 构造函数发生在基类型构造函数调用之后
在大多数情况下,这无关紧要。除非您的基本构造函数调用派生类型覆盖的虚拟方法:否则字段在被覆盖的方法中是否具有值将在两者之间有所不同。
推荐阅读
- java - 骆驼
发送字符串 - r - 在使用 R 突变和替换 NA 时分配自定义数字
- android - PN532 + UART 直接连接到 Android 手机,无需 Arduino Uno 或 Raspbery Pi
- node.js - 如何将配置从配置服务传递给 Nest.js 装饰器?
- r - 在 cro_cpct 中添加总计
- r - 如何在 R Telegram bot$sendMessage 中插入换行符
- ios - 使用 Swift 5 将字典数据转换为 JSON 格式
- c++ - C++ STL 优先级队列客户比较器不起作用
- oop - CL_SALV_TABLE 能否像 CL_GUI_ALV_GRID 一样在网格上方显示工具栏?
- python - 在文件练习中苦苦挣扎