嵌套对象初始化器语法
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#规范清楚地给出了很多关于这个主题的例子:
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; } }
还可以考虑阅读一篇很棒的章节.8。在C#深度书中简化初始化 。 Jon Skeet再次介绍了使用这种语法初始化树状结构的优点。
- 创建松散耦合/可扩展的软件架构
- 从另一方收到了不安全或不正确安全的故障
- 无法确定“System.Data.Sqlite.SqliteFactory”类型的提供程序工厂的提供程序名称
- 强制.NET JIT编译器在应用程序启动期间生成最优化的代码
- Swashbuckle.AspNetCore v1.0.0 with OAuth2,flow:application – > IdentityServer4
- 如何在单独的AppDomain中托管IronPython引擎?
- 使用DDD有界上下文的实体配置管理
- 为什么有HashSet但没有在C#中设置?
- LINQ to Entities / LINQ to SQL:在查询理解过程中从服务器(可查询)切换到客户端(可枚举)?