C# 可选构造函数

C# 可选构造函数,c#,constructor,C#,Constructor,我有一个坐标类,定义如下: public class Coordinates { [XmlIgnore] public Vector3 Vector3 { get { return new Vector3(X, Y, Z); } set { X = value.X; Y = value.Y; Z = value.Z; } } [XmlIgnore] public Coordinates(float cX, float cY, float cZ) { X = cX

我有一个
坐标
类,定义如下:

public class Coordinates
{
    [XmlIgnore]
    public Vector3 Vector3 { get { return new Vector3(X, Y, Z); } set { X = value.X; Y = value.Y; Z = value.Z; } }

    [XmlIgnore]
    public Coordinates(float cX, float cY, float cZ) { X = cX; Y = cY; Z = cZ; }

    [XmlIgnore]
    public Coordinates(Vector3 coord) { X = coord.X; Y = coord.Y; Z = coord.Z; }

    public float X { get; set; }
    public float Y { get; set; }
    public float Z { get; set; }
}
我需要能够使用以下3种方式定义此类的新实例:

Coordinates var = new Coordinates(1,2,3);
Coordinates var = new Coordinates(Vector3.Zero);
Coordinates var = new Coordinates { X = 0, Y = 0, Z = 0 }
前两个有效,但第三个无效。 如果我从类中移除构造函数,第三个构造函数可以工作,但前两个构造函数不行


如何实现这一点?

第三个只是以下代码的一个较短形式(语法糖):

Coordinates var = new Coordinates();
var.X = 0;
var.Y = 0;
var.Z = 0;
因此,您需要一个无参数的默认构造函数;它是在未定义构造函数时由编译器生成的。
请注意,在这种情况下,调用方不需要设置公共属性
X
Y
Z
的值。您需要使用空白构造函数并调用它,如果不调用它,则无法创建新对象。当没有定义其他构造函数时,会自动生成一个构造函数,但在创建自己的其他构造函数之后,必须提供一个默认构造函数才能使用该语法

将其添加到坐标类:

public Coordinates()
{
}
然后像这样创建对象:

Coordinates var = new Coordinates() { X = 0, Y = 0, Z = 0 };
public Coordinates()
{
}
Coordinates coords = new Coordinates(cX: 0, cY: 0, cZ: 0);

如果添加构造函数,则会忽略默认构造函数

只需将此代码添加到类中:

public Coordinates()
{
}

这是因为当您没有定义任何构造函数时,编译器会插入一个没有参数的默认构造函数。您只需要添加一个空构造函数

public Coordinates() { } 

然后您可以使用所有三个版本

第三个版本是默认构造函数,只有在没有定义其他构造函数的情况下,默认构造函数才是公共可用的

要声明您还希望使默认构造函数再次公开,您需要显式声明

public Coordinates() { }

这是因为在类中没有定义默认构造函数。您需要做的就是添加这样一个:

Coordinates var = new Coordinates() { X = 0, Y = 0, Z = 0 };
public Coordinates()
{
}
Coordinates coords = new Coordinates(cX: 0, cY: 0, cZ: 0);
另一种方法是使用三个浮点变量,如下所示:

Coordinates var = new Coordinates() { X = 0, Y = 0, Z = 0 };
public Coordinates()
{
}
Coordinates coords = new Coordinates(cX: 0, cY: 0, cZ: 0);

您缺少一个默认构造函数,当您没有任何构造函数时,它会自动生成。添加行:

public Coordinates(){}

定义一个不带参数的构造函数创建一个无参数的构造函数。这不是C#的语法所要求的。在这种情况下,我会说默认构造函数是“抑制”或“忽略”的。“覆盖”这个词的意思是别的,你说得对。这就是我要找的词。谢谢我会编辑它