我正在尝试使用Object初始化器来设置类的属性,然后在类的构造函数中访问它们。问题是在构造函数运行之后似乎没有设置属性。难道我做错了什么。
基础班..
public class TestClass
{
public string FirstName{get; set;}
public TestClass(){
NewClass nc = NewClass(FirstName);
}
}
客户等级
public class ClientClass
{
public ClientClass(){
TestClass tc = new TestClass{ FirstName="Jimmy"};
}
}
答案 0 :(得分:10)
对象初始化器实际上是语法糖。给出:
var person = new Person() { Name = "Matt" };
编译器会将其更改为:
Person person = new Person();
person.Name = "Matt";
(实际上,它的IL变体)
构造函数将始终在任何属性设置之前执行。在创建传递的构造函数时,非常重要的是需要任何参数来正确初始化您的类型。在您的示例中,您需要FirstName,那么为什么不将其作为构造函数参数传递?
public TestClass(string firstName) { }
答案 1 :(得分:1)
TestClass tc = new TestClass { FirstName = "Jimmy" };
是
的语法糖TestClass tc = new TestClass();
tc.FirstName = "Jimmy";
因此预期的结果就是您所观察到的 - 在构造函数执行后分配属性。
对象不变量应该由构造函数建立,并且在对象的生命周期内不会被违反(或者更实际的不变违规应该是短暂的并且对外部世界不可见)。因此,如果对于建立对象不变量非常重要,那么你真的应该将第一个名称作为构造函数参数传递。
在我看来,字段初始化程序严重过度使用。请记住,您可以强制调用者提供构造函数参数,但不能在构造新实例后设置一些属性。
答案 2 :(得分:0)
不,你没有做错任何事。这就是对象初始化程序的工作方式。它们首先调用构造函数以获取对象的引用,并且仅在设置属性之后。这只是语法糖。
答案 3 :(得分:0)
就像其他答案所说的那样。你可能会做的是使用构造函数来设置FirstName:
public TestClass(string firstName){
FirstName = firstName;
NewClass nc = NewClass(FirstName);
}