为什么不在构造函数中设置值

Por*_*Man 3 c#

鉴于上课

public class B
{
  public bool flag = false;

  public B()
  {
  }
}
Run Code Online (Sandbox Code Playgroud)

当我用线初始化它时

  var jjj = new B(){flag = true};
Run Code Online (Sandbox Code Playgroud)

如果我在构造函数B()中放置一个断点,则flag为false.我预计它是真的,因为我在初始化时调用了"flag = true".

我究竟做错了什么?

ang*_*son 9

该语法等同于:

var temp = new B();
temp.flag = true;
var jjj = temp;
Run Code Online (Sandbox Code Playgroud)

所以在构造函数中,flag仍然是false,然后从外部设置.

这不是更多代码注入构造函数的特殊语法,之后都会发生.

请注意,这是相同的:

var jjj = new B();
jjj.flag = true;
Run Code Online (Sandbox Code Playgroud)

虽然在这种情况下它可能无关紧要,但如果jjj是字段或属性,则可能会暴露出您未提前配置的对象.因此,构造临时变量以在初始化对象时保持对象,并且之后仅将对象存储到其预期目标中.

以下是有关对象初始值设定项的更多信息:


附录:正如@Tim在评论中提到的,如果你真的想要一个初始化的构造函数,flag你应该添加一个带有正确参数的重载构造函数:

public B(bool flagValue)
{
    flag = flagValue;
}
Run Code Online (Sandbox Code Playgroud)