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

时间:2013-04-22 00:34:44

标签: c# wcf constructor

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

我的问题是:

  1. 为什么编译器也不再给我默认的构造函数?
  2. 是否有设置以便始终生成此默认构造函数?
  3. 这些问题来自于使用WCF,我需要默认构造函数,但也希望能够为构造函数提供值,并且不必每次都放置默认构造函数,我不会想到未使用的默认构造函数会产生很大的开销。

5 个答案:

答案 0 :(得分:2)

拥有自定义构造函数(通常)意味着使用您通过构造函数参数提供的某些自定义信息初始化对象的内部状态。如果在这种情况下仍然有默认构造函数,那么初始状态是什么?

如果你没有自定义构造函数,那么假设你只使用默认构造函数就可以了,因为没有内部状态可以初始化。

答案 1 :(得分:0)

没有设置。

在某些情况下,默认构造函数是一种强制执行指定数据的合同的方法。

答案 2 :(得分:0)

默认构造函数是,默认情况下。但是,如果您创建自己的参数化构造函数,那么编译器会假定您要使用该构造函数,并且不再发出默认构造函数。

如果您希望默认使用WCF,则必须指定它。在其中,如果您愿意,可以使用一些默认值调用参数化构造函数。

答案 3 :(得分:0)

在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让程序员根据指定的初始化程序编写所有初始值设定项。

简而言之,总有一种方法可以做到,但你必须手工编程。没有自动方案。

答案 4 :(得分:0)

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

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