【问题标题】:Nested object initializer syntax嵌套对象初始化器语法
【发布时间】:2013-05-28 14:42:08
【问题描述】:

Resharper 刚刚向我建议了以下重构:

// Constructor initializes InitializedProperty but
// the UninitializedSubproperty is uninitialized.
var myInstance = new MyClass();
myInstance.InitializedProperty.UninitializedSubproperty = new MyOtherClass();

// becomes

var myInstance = new MyClass
    {
        InitializedProperty = { UninitializedSubproperty = new MyOtherClass() }
    };

我以前从未见过这种对象初始化。特别是我不明白如何

InitializedProperty = { UninitializedSubproperty = new MyOtherClass() }

有任何意义 - 它不是分配任何东西给InitializedProperty

这种行为是否在任何地方指定?

【问题讨论】:

标签: c# specifications object-initializers


【解决方案1】:

此语法称为Object Initialization。 C# 规范清楚地给出了很多关于这个主题的例子:

7.6.10.2 对象初始化器

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

例如:

Rectangle r = new Rectangle
            {
                P1 = { X = 0, Y = 1 },
                P2 = { X = 2, Y = 3 }
            };

编译为:

Rectangle r = new Rectangle();
r.P1.X = 0;
r.P1.Y = 1;
r.P2.X = 2;
r.P2.Y = 3;

拥有:

public class Rectangle
{
    public Rectangle()
    {
        P1 = new Point(); //default Point for demo purpose
        P2 = new Point(); //default Point for demo purpose
    }

    public Point P1 { get; set; }
    public Point P2 { get; set; }
}

public class Point
{
    public int X { get; set; }
    public int Y { get; set; }
}

还可以考虑阅读C# 深入 书中的精彩章节8.3 简化初始化。 Jon Skeet 提供了另一种使用这种语法初始化树状结构的优势。

【讨论】:

  • 啊,感谢您在规范中为我提供支持 - 不像所有在线示例那样容易找到,而且我发现的示例中 没有一个 没有做任何事情而不是简单, 顶级任务。规范确实说对象初始化器本身可以包含对象初始化器,我猜这是关键点。
  • @Rawling 是的,object-initializer 有一个伪代码,正如 C# 规范为所有构造提供的那样。我不想把它带到这里,因为格式完全丢失了。
  • 您指的是哪个版本的标准?据我所知,相关部分是 4.5 和 5.0 版本中的 7.6.10.2。
  • 哇,我也不知道这个,规范中没有任何例子。非常酷且有用的功能。我看到github.com/dotnet/docs/issues/12979 存在 GitHub 问题
  • 我有一个相关的问题。如果有一个额外的嵌套级别,我们必须将一个参数传递给“new Point(someArg)”,其中 someArg 是在构造 Rectangle() 时定义/设置的。谢谢
猜你喜欢
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多