我们可以在运行时为C#中的默认构造函数创建一个主体吗?

我们可以在运行时为C#中的默认构造函数创建一个主体吗?,c#,constructor,C#,Constructor,在一个类中会有一个构造函数。如果程序员定义了它,那么它肯定会有一个主体。但是如果我们不定义它,那么该构造函数会有一个默认的主体吗?如果您将默认构造函数的实现留给编译器(如果您不定义它就会发生这种情况),那么构造函数会将所有字段初始化为它们的默认值 例如 使用 { T场; 字符串str; 与() { 字段=默认值(T); str=“”; } } 无阶级 { T场; 字符串str=“”; } 从函数的角度来看,将具有相同的默认构造函数如果不定义构造函数,编译器将在内部考虑默认的空构造函数。它可以用

在一个类中会有一个构造函数。如果程序员定义了它,那么它肯定会有一个主体。但是如果我们不定义它,那么该构造函数会有一个默认的主体吗?

如果您将默认构造函数的实现留给编译器(如果您不定义它就会发生这种情况),那么构造函数会将所有字段初始化为它们的默认值 例如

使用
{
T场;
字符串str;
与()
{
字段=默认值(T);
str=“”;
}
}
无阶级
{
T场;
字符串str=“”;
}

从函数的角度来看,将具有相同的默认构造函数

如果不定义构造函数,编译器将在内部考虑默认的空构造函数。它可以用于为该类创建新实例,而不是分配类属性/成员。

默认构造函数不会做任何事情,它只是满足类具有构造函数的要求。

如果您具有以下类:

class A { }
编译器将创建一个空构造函数。如果添加一些带有初始化的字段,如:

class A 
{ 
    private string someField = "some text";
}

…生成的构造函数体将包含将值分配给字段的代码。

如果未定义任何构造函数,则会为您创建一个默认构造函数,但它除了将属性设置为其默认值(如类定义中指定的,或使用
default
运算符)外,不会执行任何操作。如果您定义了一个无参数构造函数,那么它具有您指定的任何主体。如果您定义任何接受参数的构造函数,则必须手动定义无参数构造函数;在这种情况下,编译器不会为您创建一个类。

您定义的每个类都继承自
对象。默认构造函数主体如下所示

public object()
{
}
public Person()
{
    this.Name = string.Empty;
    this.Firstname = string.Empty;
    this.Middlename = string.Empty;
}
所以,如果你有这样一门课:

public sealed class Person
{
    public string Name = string.Empty;
    public string Firstname = string.Empty;
    public string Middlename = string.Empty;

    public string Fullname
    {
        get { return string.Concat(Name, Firstname, Middlename); }
    }

}
然后构造函数将如下所示

public object()
{
}
public Person()
{
    this.Name = string.Empty;
    this.Firstname = string.Empty;
    this.Middlename = string.Empty;
}

编辑:如果您使用.NET Reflector,您可以分解程序集以查看实际情况。

您可以使用.NET Reflector来探索这些“编译器生成了什么”类型的问题。如果没有定义初始化,它将使用默认值(T),其中T是field@Rune:如果该字段未在代码中初始化,则在生成的构造函数中不会有该字段的迹象(对于
class A{}
class A{private string someField;}
,其外观相同).@Frederik这是你如何看待它的问题。调用构造函数时,将初始化对象的内存,如果未定义初始值设定项,则将使用默认值。但是,这可能由CLR决定。只是想澄清一下,这并不是说“你几乎正确”的评论,而是你的正确,这也适用于(从函数的角度)@Rune:是的,我在发布我的评论后意识到:)如果没有给出init代码,字段会用默认值初始化,这是绝对正确的,但是(正如你所指出的)在调用构造函数之前由CLR处理。@Frederik yes和初始值设定项(可能仅对显式初始值设定项为true)继承链中的构造函数实际上是按相反的顺序调用的:但我发现,对于初始值设定项和构造函数调用的担心会让人感到困惑,而不是帮助,因此我倾向于将其简化为“构造函数调用”,这意味着使用“new”关键字时发生的一切。(与这里的问题相比,哪一个原因可能被视为有点不对劲)它不会做任何事情是不正确的。它负责FieldsBatable的初始化:我认为CLR会在构造函数调用之前进行初始化,而不管构造函数是否为默认构造函数。除非你清楚你的事实,否则你不应该记下我的名字。Herbie一个带有带“”的字符串的显式初始化的类在默认构造函数中会是这样的:IL\u 0000:ldarg.0 IL\u 0001:ldstr“”IL_0006:stfld string类Stackoverflow.Sorter`1::str IL_000b:ldarg.0 IL_000c:call instance void mscorlib]System.Object::.ctor(),其中最后两行是对基类构造函数的调用(在本例中为System.Object)事实上,默认构造函数使用显式初始化器初始化字段,并调用基类构造函数。很抱歉,这并不是什么