在 C# 中,当我创建一个空类时,它提供了一个默认构造函数,但是当我提供一个带参数的构造函数时,不再创建默认构造函数。
我的问题是:
- 为什么编译器不再给我默认构造函数?
- 是否有设置始终生成此默认构造函数?
这些问题源于使用 WCF,我需要默认构造函数,但也希望能够为构造函数提供值,最好不必每次都放置默认构造函数,我不会认为未使用的默认构造函数会产生很多开销。
在 C# 中,当我创建一个空类时,它提供了一个默认构造函数,但是当我提供一个带参数的构造函数时,不再创建默认构造函数。
我的问题是:
这些问题源于使用 WCF,我需要默认构造函数,但也希望能够为构造函数提供值,最好不必每次都放置默认构造函数,我不会认为未使用的默认构造函数会产生很多开销。
拥有自定义构造函数(通常)意味着对象的内部状态使用您通过构造函数参数提供的一些自定义信息进行初始化。如果在这种情况下仍然有默认构造函数,那么初始状态会是什么?
如果您没有自定义构造函数,那么假设您只使用默认构造函数就可以了,因为没有要初始化的内部状态。
没有它的设置。
在某些情况下,默认构造函数是一种强制约定指定数据的方式。
默认构造函数存在于...默认。但是,如果您创建自己的参数化构造函数,则编译器会假定您要使用该构造函数,并且不再发出默认构造函数。
如果您想要使用 WCF 的默认值,则必须指定它。如果您愿意,可以在其中使用一些默认值调用参数化构造函数。
在 C++、C♯、Java 及其后代语言中,编写自定义构造函数是因为需要确保对象已初始化并处于一致状态。编译器无法猜测它应该如何初始化对象,因此它甚至不会尝试。有很多方法可以为类同时拥有默认构造函数和自定义构造函数。
Java 有相互引用的构造函数:
public Name(String givenName, String middleName, String surName) {...}
public Name(String givenName, String surName) {
this(givenName, null, surname);
}
C++11 引入了委托构造函数,它们做同样的事情。C++ 一直都有默认参数,它也可以做同样的事情。C♯ 似乎只有默认参数。
其他语言使用约定:Objective-C 让程序员根据指定的初始化程序编写所有初始化程序。
简而言之,总有办法做到这一点,但你必须手动编程。不存在自动方案。
如果您没有为您的类提供任何构造函数定义,编译器只会创建默认构造函数。原因可能是:当你需要创建对象的实例时,你需要调用构造函数,所以如果编码器没有定义构造函数,编译器会添加它使其工作。
但是一旦你已经定义了一个构造函数,那就告诉编译器用户意识到了构造函数的需要,因此默认构造函数不会被自动添加。您需要手动插入自己的默认构造函数。我不认为有这个设置。