如何将多个构造函数添加到结构?

Posted

技术标签:

【中文标题】如何将多个构造函数添加到结构?【英文标题】:How to add multiple constructors to a struct? 【发布时间】:2021-11-24 00:53:00 【问题描述】:

我有以下代码:

struct test 
    public int a;
    public int b;

    public test(int a) 
        this(a, null);
    

    public test(int a, int b) 
        this.a = a;
        this.b = b;
    

我想为test 结构提供两个不同的构造函数,一个只需要传入a,另一个可以传入ab

此代码不起作用,因为它失败并出现一些错误:

对于public test(int a) 行:

在将控制权返回给调用者之前,必须完全分配字段“test.a”

在将控制权返回给调用者之前,必须完全分配字段“test.b”

对于this(a, null); 行:

需要方法名称。

“this”对象在其所有字段都已分配之前不能使用

【问题讨论】:

两个错误:int 不能是null,你必须通过0。而test(int a) this(a, null); 应该是test(int a) : this(a, 0) int 不能是null 试着把0. 抱歉,关于 int null 的事情你是对的,我只是在拼凑一个简单的例子。在我的真实用例中,我有一个可以为空的属性,所以只是误译了它。 【参考方案1】:

试试这个

struct Test 

    public readonly int a;
    public readonly int b;

    public Test(int a) : this()
    
        this.a = a;
        this.b = 0;
    

    public Test(int a, int b) : this()
    
        this.a = a;
        this.b = b;
    

另一种方法是在一个构造函数中使用可选参数

    public Test(int a, int b = 0) : this()
    
        this.a = a;
        this.b = b;
    

或者用default(int)代替0,或者只是default

    public Test(int a) : this()
    
        this.a = a;
        this.b = default(int);
    

: this() 调用是 Microsoft 在使用 create constructor 工具时添加的,所以我在这里添加了它。我想只是为了提醒代码的读者,先分配栈空间,再分配字段。

我还添加了 readonly 关键字,因为可变结构是邪恶的,并且为了强调需要在构造函数结束之前定义所有字段的要求。

或者你总是可以使用另一个构造函数中的一个构造函数

    public Test(int a) : this(a, 0)
     

【讨论】:

【参考方案2】:
struct test 
    public int a;
    public int b;

    public test(int a) : this(a, 0)  
    
    public test(int a, int b = 0) 
        this.a = a;
        this.b = b;
    

您不能将 null 分配给 int。此外,您的变量名称不明确。您可以使用可选参数来实现您要查找的内容。或链接构造函数。

【讨论】:

以上是关于如何将多个构造函数添加到结构?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?

如何将 useUnifiedtopology 属性添加到 MongoClient 构造函数

MailAddress 构造函数中的多个地址

Groovy 将代码添加到构造函数

如何通过类构造函数创建成员对象?

C ++将具有重载构造函数的对象添加到另一个对象