2013-04-22 16 views
0

在C#中,当我创建一个空的类但它提供了一个默认的构造函数时我提供默认的构造函数不再创建参数的构造函数。为什么会出现并不总是默认的构造函数

我的问题是:

  1. 为什么编译器不再给我默认的构造函数呢?
  2. 是否有一个设置,以便始终生成此默认构造函数?

这些问题源于WCF的工作,我需要默认的构造函数,但也希望能够提供一个构造函数的值,这将是很好的不必每次都放置默认的构造函数,我wouldn不认为未使用的默认构造函数会造成很大的开销。

+0

一个澄清:它的WCF的默认IInstanceProvider需要一个默认的服务构造...它不是框架本身的限制。您可以使用自定义IInstanceProvider来解决此限制。 – ErnieL 2013-04-22 02:35:23

回答

2

有一个定制的构造(通常)意味着该对象的内部状态与你通过构造参数提供一些定制信息初始化。如果在这种情况下仍然有默认构造函数,那么初始状态会是什么?

如果您没有自定义构造函数,那么假设您只是使用默认构造函数,因为没有内部状态进行初始化,所以它被认为没问题。

0

没有设置。

在某些情况下,默认的构造是执行该数据中指定一个合同的方式。

0

默认的构造函数的存在方式是,以及...默认。但是,如果您创建自己的参数化构造函数,那么编译器会假定您想使用该构造函数,并且不再发出默认构造函数。

如果你想有一个默认与WCF使用,你必须指定它。在它中,如果您愿意,可以使用一些默认值调用您的参数化构造函数。

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的有程序员编写初始化所有在指定初始化的条款。

总之,总有办法做到这一点,但你必须手动将其编程。没有自动方案存在。

0

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

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

相关问题