C# 对象初始值设定项和构造函数
我试图使用对象初始值设定项来设置类的属性,然后在类的构造函数中访问它们。问题是,直到构造函数运行之后,才设置属性。我做错什么了吗 基本类C# 对象初始值设定项和构造函数,c#,object,object-initializers,C#,Object,Object Initializers,我试图使用对象初始值设定项来设置类的属性,然后在类的构造函数中访问它们。问题是,直到构造函数运行之后,才设置属性。我做错什么了吗 基本类 public class TestClass { public string FirstName{get; set;} public TestClass(){ NewClass nc = NewClass(FirstName); } } 客户端类 public class ClientClass { publi
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"};
}
}
不,你没有做错任何事。对象初始值设定项就是这样工作的。他们首先调用构造函数以获得对对象的引用,并且只有在设置属性之后才调用。这只是语法上的糖分。对象初始值设定项实际上是语法上的糖分。鉴于:
var person = new Person() { Name = "Matt" };
编译器将此更改为:
Person person = new Person();
person.Name = "Matt";
(实际上是它的IL变体)
构造函数将始终在任何属性集之前执行。在创建构造函数时,传递正确初始化类型所需的任何参数是非常重要的。在您的示例中,您需要FirstName,那么为什么不将其作为构造函数参数传入呢
public TestClass(string firstName) { }
语法上的糖是什么
TestClass tc = new TestClass();
tc.FirstName = "Jimmy";
因此,预期的结果就是您观察到的结果-属性是在构造函数执行之后分配的
对象不变量应该由构造函数建立,并且在对象的生命周期内不会被违反(或者更实际的不变量违反应该是短期的,并且对外部世界不可见)。因此,如果名字对于建立对象不变量很重要,那么您确实应该将其作为构造函数参数传递
在我看来,字段初始值设定项被过度使用。请始终记住,您可以强制调用方提供构造函数参数,但不能在构造新实例后设置某些属性。正如其他答案所述。您可以使用构造函数设置FirstName:
public TestClass(string firstName){
FirstName = firstName;
NewClass nc = NewClass(FirstName);
}
public TestClass(string firstName){
FirstName = firstName;
NewClass nc = NewClass(FirstName);
}