gpt4 book ai didi

c# - 似乎对象初始值设定项与构造函数 + 属性赋值不同。为何如此?

转载 作者:太空狗 更新时间:2023-10-30 00:37:38 25 4
gpt4 key购买 nike

考虑下面的代码:

class Data
{
public string Name;
public string NameWithSufix;
}

class Behaviour
{
private Data data;
public string Name { get { return data.Name; } private set { } }

public Behaviour()
{
data = new Data()
{
Name = "My Name",
NameWithSufix = Name + " Sufix",
};
//data = new Data();
//data.Name = "My Name";
//data.NameWithSufix = Name + " Sufix";
}
}

class Program
{
static void Main(string[] args)
{
Behaviour behaviour = new Behaviour();
}
}

如果您运行此程序,它将失败并在 Name 属性处出现 NullReferenceException。 Thisthis答案和 Visual Studio 试图说服我对象初始值设定项和对象构造函数后跟属性分配是相同的,但似乎并非如此。如果我用注释代码交换构造函数的主体,它就可以工作。看起来 initiliazer 在尝试分配属性之前实际上并没有运行构造函数。为什么?

最佳答案

NameWithSufix = Name中的

Name指向data.Name,此时data为null .更好地表示对象初始化器的作用是这样的:

Data d = new Data();
d.Name = "My Name";
d.NameWithSufix = this.data.Name /*Name*/ + " Sufix"; // <-- see the problem here

this.data = d;

在对象初始化程序完成之前,请注意 this.data 不会被设置。

这由 C# language specification 支持,正如 PetSerAl 所指出的。

关于c# - 似乎对象初始值设定项与构造函数 + 属性赋值不同。为何如此?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47366192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com