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

时间:2015-08-04 15:40:25

标签: c#

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

当创建一个类的实例时,会出现某种类型的隐藏/默认"构造函数"设置字段但不调用属性的设置者?

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

最后这个执行顺序是否有充分的理由?

输出:

测试:5
Test2:0

using System.IO;
using System;

class Program
{
    static void Main()
    {
        Test test = new Test();
        Test2 test2 = new Test2();
    }
}

class Test
{
    private int x = 5;
    public Test(){
        Console.WriteLine("Test: " + x);
    }
}

class Test2
{
    private int _x;
    private int x{
        get
        {
            return _x;
        }
        set
        {
            _x = 5;
        }
    }
    public Test2(){
        Console.WriteLine("Test2: " + x);
    }
}

2 个答案:

答案 0 :(得分:8)

  

当创建一个类的实例时,会出现某种类型的隐藏/默认"构造函数"设置字段但不调用属性的设置者?

为什么要打电话给酒店的人?用称之为的是什么? (您的属性设置器不使用value,它通常会......)

不存在隐藏的构造函数 - 只是在调用基类构造函数之前执行字段初始化程序。属性设置器隐式调用。

来自C#5规范的第10.11.2节:

  

当实例构造函数没有构造函数初始化程序,或者它具有base(...)形式的构造函数初始值设定项时,该构造函数隐式执行实例字段的 variable-initializers 指定的初始化在班上宣布。

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

public int Foo { get; set; } = 10;

这只是意味着支持字段将使用10的值初始化为普通字段。

答案 1 :(得分:0)

pmaj,

您需要做的就是在test2()中初始化支持字段,就像在test()中定义字段一样。所以你可能有以下内容:

var node = xmlDoc.SelectSingleNode("//customers/add[@id='1']");