gpt4 book ai didi

c# - 在类声明中初始化对象与构造函数的区别

转载 作者:太空宇宙 更新时间:2023-11-03 19:40:18 25 4
gpt4 key购买 nike

我正在为我的对象进行对象初始化和构造函数初始化,但无法得到对我的问题的准确答复。这里的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() 是基础构造函数调用)
  • 构造函数在基类型构造函数调用之后发生

在大多数情况下,这无关紧要。除非您的基础构造函数调用派生类型覆盖的虚方法:否则该字段在覆盖方法中是否具有值在两者之间是不同的。

关于c# - 在类声明中初始化对象与构造函数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54446458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com