为什么不总是有默认构造函数

本文关键字:默认 构造函数 为什么不 | 更新日期: 2023-09-27 18:10:25

在c#中,当我创建一个空类时,它提供了一个默认构造函数,但是当我提供一个带参数的构造函数时,默认构造函数不再被创建。

我的问题是:

  1. 为什么编译器不再给我默认构造函数?
  2. 是否有一个设置,使这个默认构造函数总是生成?

这些问题是在使用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要求程序员根据指定初始化式编写所有初始化式。

简而言之,总有办法做到这一点,但你必须手工编程。

如果你没有为你的类提供任何构造函数定义,编译器只会创建默认的构造函数。原因可能是:当您需要创建对象的实例时,您需要调用构造函数,因此如果编码器没有定义构造函数,编译器将添加它以使其工作。

但是一旦你已经定义了一个构造函数,这就告诉编译器用户意识到了构造函数的需要,因此默认构造函数不会被自动添加。你需要手动插入你自己的默认构造函数。我想这里没有设置