C#:使用内联对象实例直接设置子类属性

时间:2012-10-12 17:10:58

标签: c# object inline instantiation

我意识到还有其他方法来修饰这只猫,但我希望有人可以帮助我理解为什么在C#中,在内联实例化“主”对象时,我不能直接设置子类属性。

例如,如果我有以下类:

public class SubClass
{
  public string SubField { get; set; }
}

public class MainClass
{
  public string MainField { get; set; }
  public SubClass Sub { get; set; }

  public MainClass()
  {
    Sub = new SubClass();
  }
}

如果我尝试以下操作,我会收到错误:

var main = new MainClass
{
  MainField = "Main Value",
  Sub.SubField = "Sub Value"
};

我在“Sub.SubField = ...”行上得到的错误是:

* "Invalid initializer member declarator"
* "The name 'Sub' does not exist in the current context"

以下,当然有效:

var main = new MainClass
{
  MainField = "Main Value",
  Sub = new SubClass { SubField = "Sub Value" }
};

但是,它更麻烦,在我看来,封装更少。

我很困惑为什么C#不识别声明的对象和/或它如何知道它还没有被实例化。在其他情况下并不是那么小心。

我确定我错过了一个重要的概念。有人在启发我吗?提前谢谢!

4 个答案:

答案 0 :(得分:3)

这将做你想要的:

var main = new MainClass { 
  MainField = "Main Value", 
  Sub = { SubField = "Sub Value" } 
}; 

上面的代码实际上是按照以下方式编译的:

var main = new MainClass(); 
main.MainField = "Main Value";
main.Sub.SubField = "SubValue";

我更喜欢对象初始化语法,因为它的噪音略小,而且因为大多数开发人员都习惯使用C#块,所以他们更可能将所有内容保存在一起。

另外,我建议让MainClass上的Sub属性具有私有可设置性。

答案 1 :(得分:2)

首先,那不是一个子类。它是一个单独的对象,作为属性公开......

引用MS:对象初始值设定项允许您在创建时为对象的任何可访问字段或属性赋值,而无需显式调用构造函数。

请参阅:http://msdn.microsoft.com/en-us/library/bb384062.aspx

答案 2 :(得分:0)

你所尝试的是非法的,无论如何都没有意义,因为Sub是一个新对象。你仍然可以达到你想要的效果(见安迪的回答)。

请参阅C#语言说明中的第7.6.10.2节“对象初始值设定项”,其中指出:

  

对象初始值设定项由一系列成员初始值设定项组成,由{和}标记括起并用逗号分隔。每个成员初始值设定项必须命名要初始化的对象的可访问字段或属性,后跟等号和表达式或对象初始值设定项或集合初始值设定项。对象初始值设定项为同一字段或属性包含多个成员初始值设定项是错误的。对象初始化程序无法引用它正在初始化的新创建的对象。

答案 3 :(得分:-1)

为什么你不能,@ SonicTheLichen有一个链接。清洁方法?也许在MainClass中公开一个公共集属性来访问和写入,然后在初始化器中引用。