没有默认构造函数的C#对象初始值设定项

本文关键字:对象 默认 构造函数 | 更新日期: 2023-09-27 18:29:53

我正在尝试使用c#对象初始值设定项创建一个对象。但该类已经有了一个构造函数,根据需要有一个参数,我不需要默认的构造函数,所以我没有提供。当类中存在用户提供的构造函数时,编译器也不会提供默认构造函数。

现在,当我尝试使用对象初始化器创建这个类的实例时,问题就出现了:

public class Foo
{
    public int Data { get; set; }
    public Foo(int Data)
    {
        this.Data = Data;
    }
}

我这样实例化类:

 Foo f=new Foo { Data=10};

现在我得到了一个编译时错误:

"Foo不包含接受0参数的构造函数"

我知道这个错误,因为缺少默认构造函数。当我不需要默认构造函数时,为什么我要提供一个只用于使用对象初始值设定项的构造函数?所以我只是想知道,在不显式提供默认构造函数的情况下,有没有其他方法(风格、语法)可以使用这个对象初始值设定项?

我查看了这个MSDN链接,它说如果你的类中有一个PRIVATE默认构造函数,你就不能使用对象初始值设定项,但我这里没有一个私有的默认构造函数。

没有默认构造函数的C#对象初始值设定项

如果您已经有一个构造函数接受正确初始化对象所需的参数,那么为什么不使用正确的构造函数语法呢?

Foo f = new Foo { Data = 10 };  // What you want (object initializer syntax)
Foo f = new Foo ( Data : 10 );  // What you can get (constructor syntax)

然后不要使用对象初始化程序。只需通过构造函数传递值:

Foo f=new Foo(10);

如果你想使用对象初始化程序,你可以:

Foo f=new Foo(10){ Data=10};

但是您设置了两次相同的值,所以没有点

对象初始值设定项语法是以下内容的简写:

var x = new MyClass();
x.Property1 = "value1";
x.Property2 = "value2";
x.Property3 = "value3";
...

您可以通过创建一个具有伪内容和断点的默认构造函数来验证这一点,然后使用对象初始值设定项实例化类;断点将被命中,即使您没有显式调用默认构造函数。

所以当你做var x = new MyClass { Property1 = "value1", Property2 = "value2, Property3 = "value3" };时。您正在调用默认构造函数。如果它丢失了,就会得到您注意到的编译时错误。