构造函数的链式调用

本文关键字:调用 构造函数 | 更新日期: 2023-09-27 18:04:43

我目前正在学习c#,我正在学习构造函数和构造函数的链式调用,以便不必在每个构造函数中粘贴相同的代码(变量的相同值)。

我有三个构造函数,一个没有参数,一个有三个参数,一个有四个参数。我想要做的是,使用默认构造函数调用带有三个参数的构造函数,传递参数(变量)的默认值,而有三个参数的构造函数,我想要调用带有四个参数的构造函数。我似乎有第一个排序列表的默认值,但我正在努力如何编写构造函数与三个参数,然后得到这个调用构造函数与四个参数,如果需要。

默认构造函数应将string类型的所有实例变量赋值给string. empty .

public Address()
{
   m_street = string.Empty;
   m_city = string.Empty;
   m_zipCode = string.Empty;
   m_strErrMessage = string.Empty;
   m_country = Countries;
}

public Address(string street, string city, string zip)
{
}
public Address(string street, string city, string zip, Countries country)
{
}

我想做以下事情,但它不起作用:-

public Address(string street, string city, string zip)
     : this street, string.Empty, city, string.Empty, zip, string.Empty
{
}

构造函数的链式调用

通常应该将具有最少信息的构造函数链接到具有最多信息的构造函数上,而不是相反。这样,每个字段都可以精确地分配到一个位置:包含最多信息的构造函数。在你的文章中,你已经描述了的行为,但是你的代码做了一些完全不同的事情。

您还需要使用正确的构造函数链接语法,即:

: this(arguments)
例如:

public class Address
{
    private string m_street;
    private string m_city;
    private string m_zipCode;
    private string m_country;
    public Address() : this("", "", "")
    {
    }

    public Address(string street, string city, string zip)
        : this(street, city, zip, "")
    {
    }
    public Address(string street, string city, string zip, string country)
    {
        m_street = street;
        m_city = city;
        m_zip = zip;
        m_country = country;
    }
}

有关构造函数链的更多信息,请参阅我不久前写的文章

我们的想法是将实例化的逻辑留给接受最多参数的构造函数,并将其他方法用作只向该构造函数传递值的方法,这样您只需编写一次代码。

试试这个:

public Address() 
  : this(String.Empty, String.Empty, String.Empty)
{
}

public Address(string street, string city, string zip) 
  : this(street, city, zip, null)
{
}
public Address(string street, string city, string zip, Countries country) 
{
    m_street = street;
    m_city = city;
    m_zipCode = zip;
    m_country = Countries;
    m_strErrMessage = string.Empty;
}

你需要():

public Address(string street, string city, string zip)
      : this(street, string.Empty, city, string.Empty, zip, string.Empty)
{
}

这将使用指定的6个参数中的3个来调用Address构造函数(如果有一个),这是你想要做的吗?

您的语法很接近。试试这个

public Address(string street, string city, string zip)
      : this( street, string.Empty, city, string.Empty, zip, string.Empty )
{
}

在您的示例中,您还应该删除默认构造函数,并将变量的初始化放入链末尾的构造函数中。在你的例子中,这个是一个国家。

您可以使用this调用同一对象上的其他构造函数。一般的想法是在最复杂的构造函数中对属性/字段进行实际的初始化,并将逐渐简单的构造函数链接在一起,给出默认值。

假设Countries为Enum,如:

public enum Countries
{
   NotSet = 0,
   UK,
   US
}

你可以这样做(注意,你的enum不一定要有默认状态,比如NotSet,但如果没有,你只需要在没有指定值的情况下决定默认状态是什么):

public Address()
  :this(String.Empty,String.Empty,String.Empty)
{        
}
public Address(string street, string city, string zip)
  :this(street,city,zip,Countries.NotSet)
{
}
public Address(string street, string city, string zip, Countries country) 
{ 
    m_street = street;
    m_city = city
    m_zipCode = zip;
    m_country = country;
}

构造函数链需要括号,如下所示:

public Address(string street, string city, string zip)
          : this (street, string.Empty, city, string.Empty, zip, string.Empty)
    {
    }