[英]C#: Directly Setting Subclass Properties with Inline Object 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#无法识别声明的对象和/或它如何知道尚未实例化它。 在其他情况下,它不是很小心。
我确定我缺少一个主要概念。 有人启发我吗? 提前致谢!
这将做您想要的:
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属性具有私有settablility。
首先,这不是子类。 这是一个单独的对象,作为属性公开...
引用MS:对象初始化程序使您可以在创建时将值分配给对象的任何可访问字段或属性,而不必显式调用构造函数。
请参阅: http : //msdn.microsoft.com/en-us/library/bb384062.aspx
您尝试的操作是非法的,而且还是没有任何意义,因为Sub
是一个新对象。 您仍然可以实现所需的功能(请参阅Andy的答案)。
看看C#语言规范中的7.6.10.2对象初始化程序一节,其中指出:
对象初始化器由一系列成员初始化器组成,这些序列由{和}标记括起来,并用逗号分隔。 每个成员初始值设定项都必须命名正在初始化的对象的可访问字段或属性,后跟等号和表达式或对象初始值设定项或集合初始值设定项。 对象初始化程序为同一字段或属性包含多个成员初始化程序是错误的。 对象初始化程序不可能引用正在初始化的新创建的对象。
为什么不行,@ SonicTheLichen有链接。 更清洁的方法? 也许在MainClass中公开一个公共集属性以进行访问和写入,然后在初始化器中进行引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.