默认构造函数和无参数构造函数之间的区别

本文关键字:构造函数 区别 之间 默认 参数 | 更新日期: 2023-09-27 18:33:26

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

除此之外,当您继承默认构造函数和无参数构造函数时,它们在继承类型上公开的是否完全相同?因为我的 IOC 容器似乎不这么认为。(团结(。

干杯皮特

默认构造函数和无参数构造函数之间的区别

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

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

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

除了 Kainth 和 Leijon @Fredrik@Sachin答案之外,在 .NET(也在 Java 中(中构造函数不是继承的。

显式调用基构造函数

,或者默认情况下调用基无参数构造函数。

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

我会让代码自己说话:

public class ThisHasADefaultConstructor
{
}
public class ThisHasAParameterlessConstructor
{
   public ThisHasAParameterlessConstructor()
   {
   }
}

请注意,默认构造函数实际上是在未指定构造函数(带或不带参数(时自动生成的无参数构造函数。

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

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

MSDN 声明:

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

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

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

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

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

默认构造函数是指没有参数的构造函数,由自动创建或由您创建。

如果未声明任何其他实例构造函数(带或不带参数(,则会自动创建定义构造函数。(声明静态构造函数不会避免自动创建 defautl 构造函数(。

不继承类层次结构的构造函数

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

 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 调用。

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

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

默认构造器由压缩器隐式调用,除非您显式创建了一个新构造器(没有参数(。