对象初始化器和构造器

时间:2010-07-01 12:34:43

标签: c# object object-initializers

我正在尝试使用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"};
   }
}

4 个答案:

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