如何使用构造函数初始化列表?

haa*_*nsi 30 .net c# asp.net-3.5 visual-studio

我有一个类型:

public  class Human
{
    public int Id { get; set; }
    public string Address { get; set; }
    public string Name { get; set; }
    public List<ContactNumber> ContactNumbers { get; set; }

    public Human(int id)
    {
        Id = id;
    }

    public Human(int id, string address, string name,
                 List<ContactNumber> contactNumbers) :
        this(id)
    {
        Address = address;
        Name = name;
        ContactNumbers = contactNumbers;
    }        
}
Run Code Online (Sandbox Code Playgroud)

请指导我是使用构造函数进行列表初始化的最佳实践吗?如何使用构造函数初始化列表?

编辑:

请指导我是使用构造函数进行列表初始化的最佳实践吗? 如何使用构造函数将值分配给列表,因此如果没有传递值,将使用默认值?

谢谢

Hum*_*rto 57

使用集合初始化程序

从C#3开始,您可以使用集合初始值设定项构建List并使用单个表达式填充它.以下示例构造Human及其ContactNumbers:

var human = new Human(1, "Address", "Name") {
    ContactNumbers = new List<ContactNumber>() {
        new ContactNumber(1),
        new ContactNumber(2),
        new ContactNumber(3)
    }
}
Run Code Online (Sandbox Code Playgroud)

专攻Human构造函数

您可以更改Human类的构造函数以提供填充ContactNumbers属性的方法:

public class Human
{
    public Human(int id, string address, string name, IEnumerable<ContactNumber> contactNumbers) : this(id, address, name)
    {
        ContactNumbers = new List<ContactNumber>(contactNumbers);
    }

    public Human(int id, string address, string name, params ContactNumber[] contactNumbers) : this(id, address, name)
    {
        ContactNumbers = new List<ContactNumber>(contactNumbers);
    }
}

// Using the first constructor:
List<ContactNumber> numbers = List<ContactNumber>() {
    new ContactNumber(1),
    new ContactNumber(2),
    new ContactNumber(3)
};

var human = new Human(1, "Address", "Name", numbers);

// Using the second constructor:
var human = new Human(1, "Address", "Name",
    new ContactNumber(1),
    new ContactNumber(2),
    new ContactNumber(3)
);
Run Code Online (Sandbox Code Playgroud)

底线

哪种替代方案是最佳做法?或者至少是一个好的做法?你判断它!IMO,最佳做法是尽可能清楚地将程序编写给任何必须阅读它的人.在这种情况下,使用集合初始化程序对我来说是一个赢家.使用更少的代码,它可以做几乎与替代品相同的东西 - 至少,我提供的替代品......


joc*_*oce 5

你在找这个吗?

ContactNumbers = new List<ContactNumber>(){ new ContactNumber("555-5555"),
                                            new ContactNumber("555-1234"),
                                            new ContactNumber("555-5678") };
Run Code Online (Sandbox Code Playgroud)