C#中字段和set/get的执行顺序?

C#中字段和set/get的执行顺序?,c#,C#,我对C#中关于字段和set/get属性设置的执行顺序感到困惑。为什么在调用构造函数时,Test2中的值没有设置,而Test中的值没有设置 创建类的实例时,是否存在某种类型的隐藏/默认“构造函数”,用于设置字段,但不调用属性设置器 setter是在构造函数之后自动调用的,还是我必须显式地调用它 最后,这种执行顺序有没有很好的理由 输出: 测试:5 测试2:0 创建类的实例时,是否存在某种类型的隐藏/默认“构造函数”,用于设置字段,但不调用属性设置器 它为什么要调用属性设置器?它会用什么来称呼他们?

我对C#中关于字段和set/get属性设置的执行顺序感到困惑。为什么在调用构造函数时,Test2中的值没有设置,而Test中的值没有设置

创建类的实例时,是否存在某种类型的隐藏/默认“构造函数”,用于设置字段,但不调用属性设置器

setter是在构造函数之后自动调用的,还是我必须显式地调用它

最后,这种执行顺序有没有很好的理由

输出:

测试:5
测试2:0

创建类的实例时,是否存在某种类型的隐藏/默认“构造函数”,用于设置字段,但不调用属性设置器

它为什么要调用属性设置器?它会用什么来称呼他们?(您的属性设置器不使用通常会使用的

这不是存在隐藏构造函数的问题——只是在调用基类构造函数之前执行字段初始值设定项。属性设置器不是隐式调用的

根据C#5规范第10.11.2节:

当实例构造函数没有构造函数初始值设定项,或者它有一个形式为
base(…)
的构造函数初始值设定项时,该构造函数隐式执行由其类中声明的实例字段的变量初始值设定项指定的初始化

请注意,从C#6开始,您也可以使用默认值自动实现属性:

public int Foo { get; set; } = 10;
这只意味着备份字段将像普通字段一样,用
10
的值初始化。

pmaj

您只需在test2()中初始化backing字段,方法与在test()中定义字段的方法相同。因此,您可能有以下几点:

class Test2
{
private int _x = -1; // The default value is -1
private int x{
    get
    {
        return _x; // return whatever is in _x
    }
    set
    {
        _x = 5; // Change _x to 5 (or whatever is in value)
    }
}
public Test2(){
    Console.WriteLine("Test2: " + x); // should show -1
    Test2.x = 8;
    Console.WriteLine("Test2: " + x); // should show 8
}
}

这与ASP.NET有什么关系?没有执行顺序,只是永远不要调用属性上的setter,只有在设置变量时使用getter.setter。
class Test2
{
private int _x = -1; // The default value is -1
private int x{
    get
    {
        return _x; // return whatever is in _x
    }
    set
    {
        _x = 5; // Change _x to 5 (or whatever is in value)
    }
}
public Test2(){
    Console.WriteLine("Test2: " + x); // should show -1
    Test2.x = 8;
    Console.WriteLine("Test2: " + x); // should show 8
}
}