2

我正在尝试使用对象初始值设定项来设置类的属性,然后在类的构造函数中访问它们。问题是在构造函数运行之后似乎没有设置属性。难道我做错了什么。

基础班..

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

4 回答 4

10

对象初始化器实际上是语法糖。鉴于:

var person = new Person() { Name = "Matt" };

编译器会将其更改为:

Person person = new Person();
person.Name = "Matt";

(嗯,实际上是它的 IL 变体)

构造函数将始终在任何属性集之前执行。在创建构造函数时,传递任何参数以正确初始化类型是非常重要的。在您的示例中,您需要 FirstName,那么为什么不将其作为构造函数参数传递呢?

public TestClass(string firstName) { }
于 2010-07-01T12:37:42.600 回答
1
TestClass tc = new TestClass { FirstName = "Jimmy" };

是语法糖

TestClass tc = new TestClass();

tc.FirstName = "Jimmy";

因此,预期的结果就是您所观察到的 - 属性是在构造函数执行后分配的。

对象不变量应该由构造函数建立并且在对象的生命周期内不被违反(或者更实际的不变量违反应该是短暂的并且对外部世界不可见)。因此,如果名字对于建立对象不变量很重要,那么您确实应该将名字作为构造函数参数传递。

在我看来,字段初始值设定项被过度使用。始终记住,您可以强制调用者提供构造函数参数,但不能在构造新实例后设置某些属性。

于 2010-07-01T12:38:35.173 回答
0

就像其他答案所说的那样。您可能会使用构造函数来设置 FirstName:

public TestClass(string firstName){
   FirstName = firstName;
   NewClass nc = NewClass(FirstName);
}
于 2010-07-01T12:42:04.833 回答
0

不,你没有做错任何事。这就是对象初始化器的工作方式。他们首先调用构造函数以获得对对象的引用,并且只有在设置属性之后。这只是语法糖。

于 2010-07-01T12:37:31.243 回答