2012-08-01 48 views
0

如果在实例化对象时使用对象初始值设定项,对象构造函数是否可以访问已初始化的属性?构造函数是否可以访问已初始化的属性

public class ExampleClass { 
    public string proptery1 { get; set; } 
    public string property2 { get; set; } 

    public ExampleClass() { 
     if(!string.IsNullOrEmpty(property1)) { 
      ... 
     } 
    } 
} 

ExampleClass exampleClass = new ExampleClass() { 
    property1 = "hello", 
    property2 = "world" 
}; 
+3

您使用的语法不是集合初始值设定项。它是对象初始值设定项。 – Grigory 2012-08-01 15:53:52

+0

我问过这个问题,因为可能有不同的方式来做我想做的事情。我不知道我不知道什么。感谢您的低票... – bflemi3 2012-08-01 16:07:58

回答

1

没有的新实例,任何属性初始化之前调用构造函数。

您的代码:

ExampleClass exampleClass = new ExampleClass() { 
    property1 = "hello", 
    property2 = "world" 
}; 

是语言糖

ExampleClass exampleClass = new ExampleClass(); 
exampleClass.property1 = "hello"; 
exampleClass.property2 = "world"; 
1

集合初始化器调用集合的.Add方法,必须为特定集合定义该方法。该对象在传递给.Add之前将完全构造。

语法

ExampleClass exampleClass = new ExampleClass() { 
    property1 = "hello", 
    property2 = "world" 
}; 

不显示集合初始化,而是对象的初始化。

在这里,你的构造函数将被调用,然后给定属性的setter将被调用。

一个适当的例子是

List<ExampleClass> list = new List<ExampleClass>() { 
    new ExampleClass() { 
     exampleClass.property1 = "hello"; 
     exampleClass.property2 = "world";    
    } 
} 

事件的顺序将是

  1. 创建的List<ExampleClass>一个新的实例,并分配给列表
  2. ExampleClass中的一个新实例创建,构造函数调用。
  3. 属性设置器被称为上ExampleClass中
+2

为什么downvote?如果有什么不对,请分享一下。 – 2012-08-01 15:59:23

+1

DV仅适用于错误的答案。你首先写了错误的答案(那个C-tor被称为“后台字段被初始化后”。没有后备字段有问题,并且对于属性ctor被称为BEFORE。 你回答仅仅是为了得到分数吗?我认为我们都应该关心正确性,当然如果你不确定 - 就不要回答。没有人强迫你给出错误的答案。 当然,现在你已经修复了答案,但它太令人不快看到错误的答案,在可能在IDE中调试代码后修复了。 编程不是速度,它更加正确 – Grigory 2012-08-01 16:06:21

+1

@Grigory:我误解了这个问题,这就是为什么我删除了我的第一个答案。稍后在纠正之后,并假设没有进一步证据的意图,是不合适的。 – 2012-08-01 16:12:24

1

没有,构造函数将首先被调用。对象初始化只是用于调用构造函数和设置对象属性的语法糖。