我对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);
}
}
答案 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']");