2

我意识到还有其他方法可以给这只猫剥皮,但我希望有人能帮助我理解为什么在 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

3 回答 3

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 属性具有私有可设置性。

于 2012-10-12T17:28:41.110 回答
2

First, that's not a subclass. It's a separate object that is exposed as a property...

To quote MS: Object initializers let you assign values to any accessible fields or properties of an object at creation time without having to explicitly invoke a constructor.

See: http://msdn.microsoft.com/en-us/library/bb384062.aspx

于 2012-10-12T17:15:31.663 回答
0

您正在尝试的内容是非法的,并且无论如何都没有意义,因为Sub它是一个新对象。你仍然可以实现你想要的(见安迪的回答)。

查看 C# 语言规范中的第 7.6.10.2 节 Object initializers,其中指出:

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

于 2012-10-12T17:40:20.700 回答