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

C# 默认构造函数和无参数构造函数之间的区别?,c#,C#,默认构造函数没有参数。你写的没有参数的构造器也是如此。那么c#的最终区别是什么呢 此外,当您继承默认构造函数和无参数构造函数时,它们在继承类型上的公开是否完全相同?因为我的IOC容器似乎不这么认为。(团结) 干杯, Pete默认构造函数是无参数构造函数的同义词。如果不添加构造函数,则会为您插入一个没有参数的默认构造函数。如果添加构造函数(带参数或不带参数),则不会生成默认构造函数您可以通过创建无参数构造函数来覆盖默认构造函数的行为。当您将自定义对象作为类的成员,并且在创建类的实例时需要使用默认值

默认构造函数没有参数。你写的没有参数的构造器也是如此。那么c#的最终区别是什么呢

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

干杯,
Pete

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

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

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

说明:

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

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

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

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

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

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

添加到@Sachin Kainth和@Fredrik Leijon answers中,.NET(也在Java中)中的构造函数不会被继承


您可以显式调用基本构造函数,或者在默认情况下调用基本无参数构造函数。

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

我让代码自己说:

public class ThisHasADefaultConstructor
{
}

public class ThisHasAParameterlessConstructor
{
   public ThisHasAParameterlessConstructor()
   {
   }
}
 public class Base
   {
       public Base()
       {

       }
   }

   public class Derived : Base
   {
       public Derived()
       {

       }
   }

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

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

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

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

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

如果不声明任何其他实例构造函数(带或不带参数),则会自动创建default构造函数。(声明静态构造函数不会避免自动创建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)
如果需要,可以使用如下参数调用基类构造函数:

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

       }
       public Derived(int j) :base(j)
大概

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

(当然,基类中必须存在带参数的构造函数)


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

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

只要您不创建自定义无参数构造函数,它们就是同义词。不完全是。MSDN:
不带参数的构造函数称为默认构造函数
。默认值并不意味着“自动生成”,而是“如果派生类中没有选择其他构造函数,则默认调用构造函数”。我将重新表述它:“默认构造函数是空的无参数构造函数的同义词”。同样,默认构造函数不必为空。看我的答案。你的答案自相矛盾<代码>默认构造函数(…)包括一个显式声明的没有参数的构造函数。然后
如果您声明一个有参数或没有参数的构造函数,则默认构造函数不会声明。
@JacekGorgoń感谢您的评论。有时候你写的东西似乎有道理。。。而且毫无意义。我已经编辑了我的答案。