首页 > 解决方案 > 在类声明与构造函数中初始化对象的区别

问题描述

我正在为我的对象进行对象初始化和构造函数初始化,但无法准确回答我的问题。这里的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 文章的链接]

标签: c#oopconstructorobject-initializers

解决方案


这里的区别非常微妙,只能在 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()是基类构造函数调用)
  • 构造函数发生基类型构造函数调用之后

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


推荐阅读