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

标签 c#

给定类

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 是一个字段或属性,您可能会公开一个您没有及早完成配置的对象。因此,会构造一个临时变量来在初始化时保存您的对象,并且只有在初始化之后该对象才会存储到其预期目的地。

这里有一些关于对象初始化器的更多信息:


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

public B(bool flagValue)
{
    flag = flagValue;
}

关于c# - 为什么不在构造函数中设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24874854/

相关文章:

c# - 为什么我的控制台应用程序从 System32 运行?

c# - 压缩内存流但保留为流(不创建文件)?

c# - 如何将多个excel文件合并为一个excel文件

c# - 在 C# 中解析复杂字符串。

c# - 使用 C# 从 Delphi DLL 中检索记录数组

c# - 在 cshtml 文件上调用 C# 函数

c# - Quartz.NET 配置 - 不与数据库交互

c# - 如何减少Socket应用程序的C#内存使用率

c# - 为什么 C# 不让我像字典一样对动态进行索引?

c# - LINQ Any() 和 Single() 与具有空检查的 SingleOrDefault()