2010-07-01 44 views
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"}; 
    } 
} 

回答

10

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

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

编译器将其更改为:

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

(当然,实际上它的IL变体)

构造函数永远之前的任何属性集执行。创建构造函数时非常重要,您必须通过任何参数才能正确初始化类型。在你的例子中,你需要FirstName,所以为什么不把它作为构造函数参数传入?

public TestClass(string firstName) { } 
0

没有你没有做错什么。对象初始化器就是这样工作的。他们首先调用构造函数,以获得对该对象的引用,并且仅在设置了属性之后。这只是语法糖。

1
TestClass tc = new TestClass { FirstName = "Jimmy" }; 

TestClass tc = new TestClass(); 

tc.FirstName = "Jimmy"; 

和语法糖因此,预期的结果是你看到什么 - 构造函数执行后的属性分配。

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

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

0

就像其他答案说。您可能要做的是使用构造函数来设置姓氏:

public TestClass(string firstName){ 
    FirstName = firstName; 
    NewClass nc = NewClass(FirstName); 
} 
相关问题