默认构造函数没有参数。并且你写的构造函数也没有参数。那么c#的最终区别是什么?
当你继承默认构造函数和无参数构造函数时,它们在继承类型上暴露的完全相同吗?因为我的IOC容器似乎不这么认为。 (统一)。
干杯, 皮特
答案 0 :(得分:5)
如果您的类不包含显式实例构造函数,则由C#编译器添加“default”构造函数。它是 public ,无参数构造函数。如果您创建了一个显式的非公共无参数构造函数,Unity将无法以与使用公共构造函数相同的方式使用它(无论这是否由编译器生成,而不管它是否具有参数)。
答案 1 :(得分:3)
您可以通过创建无参数构造函数来覆盖默认构造函数的行为。这种情况的一个常见用途是当您将自定义对象作为类的成员时,需要在创建类的实例时使用默认值对其进行初始化。
答案 2 :(得分:2)
默认构造函数是无参数构造函数的同义词。
答案 3 :(得分:2)
添加到@Sachin Kainth和@Fredrik Leijon答案,在.NET(也在Java中)构造函数不是继承的。
您要么显式调用基础构造函数,要么默认情况下调用基本无参数构造函数。
答案 4 :(得分:1)
如果您不添加构造函数,则会为您插入一个没有参数的默认构造函数。如果添加构造函数(带或不带参数),则不会生成默认构造函数
答案 5 :(得分:1)
我会让代码说明一切:
public class ThisHasADefaultConstructor
{
}
public class ThisHasAParameterlessConstructor
{
public ThisHasAParameterlessConstructor()
{
}
}
请注意,默认构造函数实际上是一个无参数构造函数,在您未指定构造函数(带或不带参数)时自动生成。
答案 6 :(得分:1)
如果你想拥有更多的构造函数,也许你需要无参数构造函数。假设一个没有参数,一个带参数。
答案 7 :(得分:1)
如果您的类只有一个带参数的构造函数,则不允许使用无参数构造函数,除非您定义一个,换句话说,如果您在类中定义了自定义构造函数,则不会提供默认的无参数构造函数。
答案 8 :(得分:0)
MSDN州:
不带参数的构造函数称为默认构造函数。只要使用new运算符实例化对象并且没有为new提供参数,就会调用默认构造函数。
因此必须自动生成默认构造函数 not 。手写的无参数构造函数也是默认构造函数。
当您查看派生类时,这实际上是有意义的:
class A
{
public A() { ... } // do something
public A(object o) { ... } // do something else
}
class B
{
public B() { ... }
}
在创建B时调用哪个构造函数? 默认一个。
答案 9 :(得分:0)
默认构造函数是指没有参数的构造函数,可以自动创建或由您创建。
如果您没有声明任何其他实例构造函数(包含或不包含参数),则会自动创建defualt构造函数。 (声明静态构造函数不会避免自动创建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调用。
(当然,这个带参数的构造函数必须存在于Base类中。)
您只能显式调用中间基类的构造函数。
答案 10 :(得分:0)
编译器会隐式调用默认构造函数,除非您明确创建了一个新构造函数(没有参数)。