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);
}