2

默认构造函数没有参数。您编写的没有参数的构造函数也没有。那么c#的最终区别是什么?

当您继承默认构造函数和无参数构造函数时添加到这一点,它们在继承类型上暴露的完全相同吗?因为我的 IOC 容器似乎不这么认为。(统一)。

干杯,皮特

4

11 回答 11

5

如果您的类不包含显式实例构造函数,则 C# 编译器会添加“默认”构造函数。它是一个公共的、无参数的构造函数。如果您创建了显式的非公共、无参数构造函数,Unity 将无法像使用公共构造函数一样使用它(不管它是否由编译器生成,也不管它是否有参数)。

于 2012-05-08T12:33:42.213 回答
3

您可以通过创建无参数构造函数来覆盖默认构造函数的行为。一个常见的用途是当你有一个自定义对象作为你的类的成员并且你需要在你的类的实例创建时使用默认值初始化它。

于 2012-05-08T12:30:44.067 回答
2

默认构造函数是无参数构造函数的同义词。

于 2012-05-08T12:29:18.077 回答
2

添加到@Sachin Kainth 和@Fredrik Leijon 的答案,在.NET(也在Java 中)构造函数没有被继承。

您要么显式调用基本构造函数,要么默认调用基本无参数构造函数。

于 2012-05-08T12:31:54.750 回答
1

如果您不添加构造函数,则会为您插入一个没有参数的默认构造函数。如果添加构造函数(带或不带参数),则不会生成默认构造函数

于 2012-05-08T12:30:41.763 回答
1

我会让代码自己说话:

public class ThisHasADefaultConstructor
{
}

public class ThisHasAParameterlessConstructor
{
   public ThisHasAParameterlessConstructor()
   {
   }
}

请注意,默认构造函数实际上是一个无参数构造函数,当您不指定构造函数(带或不带参数)时会自动生成。

于 2012-05-08T12:33:46.623 回答
1

如果您想拥有更多构造函数,也许您需要无参数构造函数。假设一个没有参数,一个有参数。

于 2012-05-08T12:34:39.210 回答
1

如果您的类只有一个带参数的构造函数,则不允许使用无参数构造函数,除非您定义了一个,换句话说,如果您在类中定义了自定义构造函数,则不会提供默认的无参数构造函数。

于 2012-05-08T12:35:09.653 回答
0

MSDN状态:

不带参数的构造函数称为默认构造函数。每当使用 new 运算符实例化对象并且不向 new 提供任何参数时,都会调用默认构造函数。

所以默认构造函数不必自动生成。手写的无参数构造函数也是默认构造函数

当您查看派生类时,这实际上是有道理的:

class A
{
    public A() { ... } // do something
    public A(object o) { ... } // do something else
}

class B
{
    public B() { ... }
}

创建 B 时调用了哪个 A 构造函数?默认一个。

于 2012-05-08T12:31:25.300 回答
0

默认构造函数是指没有参数的构造函数,无论是自动创建的还是你自己创建的。

如果您不声明任何其他实例构造函数,无论有无参数,都会自动创建默认构造函数。(声明静态构造函数不会避免自动创建默认构造函数)。

类层次结构的构造函数不会被继承,但是在使用派生类的构造函数时,继承链上的所有构造函数都会被调用,从层次结构的根开始。除非您指定调用哪个构造函数,否则将调用每个类的默认构造函数。

 public class Base
   {
       public Base()
       {

       }
   }

   public class Derived : Base
   {
       public Derived()
       {

       }
   }

   // invokes, the  Base() construtor, and then the Derived() constructor
   var d = new Derived(); 

您还可以显式调用基类构造函数,带或不带参数,如下所示:

       // Derived class explicitly invoking base class constructor.
       public Derived() :base()
       {

       }

如果需要,您可以使用如下参数调用基类构造函数:

       public Derived(int j) :base(j)

或者

       public Derived() :base(23)

在最后一个代码示例中,如果您使用默认构造函数创建 Derived 对象,则在基类中调用的构造函数不是默认构造函数,而是使用参数 23 调用的带有整数参数的构造函数。

(当然,这个带参数的构造函数必须存在于Base类中)。

您只能显式调用中间基类的构造函数。

于 2012-05-08T12:43:30.333 回答
0

编译器会隐式调用默认构造函数,除非您明确创建了一个新构造函数(没有参数)。

于 2012-12-30T23:36:42.673 回答