【问题标题】:Difference between instance the list in the property and in the constructor [duplicate]属性中的列表和构造函数中的实例之间的区别[重复]
【发布时间】:2021-07-23 00:36:58
【问题描述】:

我需要知道在属性上实例化新 List 的最佳和有效方式是什么?为什么?

选项一

public class ObjectA
{
   public List<ObjectB> MyList { get; set; } = new List<ObjectB>();
}

选项二

public class ObjectA
{
    public List<ObjectB> MyList { get; set; } 

    public ObjectA()
    {
        this.MyList = new List<ObjectB>();
    }
}

【问题讨论】:

标签: c# object oop


【解决方案1】:

虽然有多种解释,但我会根据自己的理解尝试使用各种场景的IL代码。

  1. 在构造函数中实例化列表

在这种情况下,当对象被这个构造函数构造时,它会首先调用 instance void [System.Runtime]System.Object::.ctor() 然后构造列表

public class ObjectA
{
    public List<string> MyList { get; set; }
    public ObjectA()
    {
        this.MyList = new List<string>();
    }
}

  1. 在声明中实例化列表

在这种情况下,当构造对象时,它会首先构造列表,然后调用默认构造函数instance void [System.Runtime]System.Object::。 ctor() 然后初始化列表

public class ObjectA
{
    public List<string> MyList { get; set; } = new List<string>();
}

  1. 在声明中实例化列表,但该类有一个构造函数

在这种情况下,编译器已经在构造函数中注入了列表实例化的代码

public class ObjectA
{
    public List<string> MyList { get; set; } = new List<string>();
    public ObjectA()
    {

    }
}

  1. 在声明处实例化列表,并使用不同的构造函数创建类

在这种情况下,我们可以看到编译器也在新的构造函数中注入了列表实例化的代码

public class ObjectA
{
    public List<string> MyList { get; set; } = new List<string>();
    public ObjectA(int x)
    {

    }
}
public class ObjectB:ObjectA
{
    public ObjectB(int x):base(x)
    {
        
    }
}

  1. 在声明处实例化列表,calss有两个构造函数和一个派生类

在这种情况下,编译器在两个构造函数中都注入了列表实例化代码。 这不会发生在我们 在构造函数中实例化列表

public class ObjectA
{
    public List<string> MyList { get; set; } = new List<string>();
    public ObjectA()
    {

    }
    public ObjectA(int x)
    {

    }
}
public class ObjectB:ObjectA
{
    public ObjectB(int x):base(x)
    {
        
    }
}

总而言之,如果您有多个构造函数,则在列表或类似对象的情况下。开发人员有责任确保在使用之前初始化所有必需的对象。派生此类时,复杂性会增加。如果我们遵循干净的代码实践,我会在声明时使用更小的类。但是如果字段对象要大,在构造时做一些工作,我会在需要时初始化它们(这需要安全)

【讨论】:

    猜你喜欢
    • 2019-05-19
    • 2013-08-09
    • 2013-09-09
    • 2015-02-24
    • 2015-05-15
    • 2015-06-05
    • 2013-08-12
    • 1970-01-01
    • 2011-10-08
    相关资源
    最近更新 更多