给定类
public class B
{
public bool flag = false;
public B()
{
}
}
当我用这条线初始化它时
var jjj = new B(){flag = true};
如果我在构造函数 B() 中放置一个断点,flag 为 false。我希望它是真的,因为我在初始化它时调用了“flag = true”。
我做错了什么?
最佳答案
该语法等同于:
var temp = new B();
temp.flag = true;
var jjj = temp;
所以在构造函数中,flag
仍然是false
,然后从外部设置。
这不是将更多代码注入(inject)到构造函数中的特殊语法,这一切都是在之后发生的。
请注意,它不等同于此:
var jjj = new B();
jjj.flag = true;
虽然在这种情况下这可能无关紧要,但如果 jjj
是一个字段或属性,您可能会公开一个您没有及早完成配置的对象。因此,会构造一个临时变量来在初始化时保存您的对象,并且只有在初始化之后该对象才会存储到其预期目的地。
这里有一些关于对象初始化器的更多信息:
- Object and Collection Initializers (C# Programming Guide)
- How to: Initialize Objects by using an Object Initializer (C# Programming Guide)
- How to: Initialize a Dictionary with a Collection Initializer (C# Programming Guide)
附录:正如@Tim 在评论中提到的,如果您真的想要一个初始化flag
的构造函数,您应该添加一个具有正确参数的重载构造函数:
public B(bool flagValue)
{
flag = flagValue;
}
关于c# - 为什么不在构造函数中设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24874854/