结构体构造函数调用this()

9
我看到了下面的代码片段,想知道按这种方式编写构造函数的目的是什么?
public struct DataPoint{
    public readonly long X;
    public readonly double Y;
    public DataPoint(long x, double y) : this() {
        this.X = x;
        this.Y = y;
    }
}

this()不就是将XY设置为零吗?既然之后它们立即被设置为xy,这不是一个无意义的操作吗?


2
现在看起来似乎毫无意义,但你可以向 DataPoint 添加一个新属性,然后在默认构造函数中设置它。 - Maria Ines Parnisari
@MariaInesParnisari 对于“结构体”而言不适用:在C#中,您无法为“结构体”编写默认构造函数。 - Pablo H
1个回答

11
public DataPoint(long x, double y) : this() {

这将调用struct默认构造函数,该函数由编译器自动提供,并将所有字段初始化为它们的默认值。

在这种情况下,您的自定义构造函数已经对所有字段进行了赋值,因此这样做没有任何意义。但是假设您只赋值了X,并且没有调用默认构造函数:

public struct DataPoint{
    public readonly long X;
    public readonly double Y;
    public DataPoint(long x) {
        this.X = x;
    }
}

如果在您的参数化构造函数中未对 Y 进行赋值,那么会生成编译器错误,而且由于您已经定义了该构造函数,因此默认构造函数对消费者不可见。

this() 添加到初始化列表中可以确保所有字段都被初始化,即使您并不是唯一一个这样做的人。


4
注意:你的代码片段会生成编译器错误,而不是警告。 - Jenish Rabadiya
@JenishRabadiya 这就是我的意思,谢谢。已经修复好了。 - Jonathon Reinhart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接