Tim*_*ter 3 c# resharper initialization c#-6.0
我对象初始化器语法有一个奇怪的问题.
这是我的示例类:
public class Foo
{
public Bah BahProp { get; set; }
}
public class Bah
{
public int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
考虑以下三种方法来初始化对象:
工作正常的旧的,冗长但明确的方式:
var foo1 = new Foo();
foo1.BahProp = new Bah();
foo1.BahProp.Id = 1;
// correctly initialized
Run Code Online (Sandbox Code Playgroud)
我总是使用的第二种方法,使用对象初始化器语法:
var foo2 = new Foo
{
BahProp = new Bah { Id = 1 }
}; // correctly initialized
Run Code Online (Sandbox Code Playgroud)
第三种方式resharper建议我的同事使用不同的resharper版本(这是一个bug吗?):
var foo3 = new Foo
{
BahProp = { Id = 1 }
}; // NullReferenceException
Run Code Online (Sandbox Code Playgroud)
最后一种做法有何不同?
我的resharper版本是2016.1.1,我的同事是在10.02.我的resharper提出了第二种方式.但第三种方式做什么以及什么时候有用呢?
更新:如此看来,这是个坏ReSharper的sugestion使用最后一种方法,这就是为什么他们已经改变了它同时使用第二种方式.
NullReferenceException如果要通过初始化内联或构造函数中引用类型的所有属性/字段,可以避免使用第三种方法.
我肯定不会使用这种奇怪的属性赋值语法.
new Foo { BahProp = { Id = 1 } }
Run Code Online (Sandbox Code Playgroud)
编译为:
new Foo().BahProp.Id = 1;
Run Code Online (Sandbox Code Playgroud)
或者,更详细一点:
var foo3 = new Foo();
foo3.BahProp.Id = 1;
Run Code Online (Sandbox Code Playgroud)
所以BahProp是空的.你没有构建它.
(这可能是所有C#中最令人困惑的语法)
选项2有效,因为你正在调用Bah的构造函数.
如果你在Foo的构造函数中初始化BahProp,选项3也会起作用.它将BahProp = { Id = 1 }被称为时间.
收集初始化器也是如此:
public class Foo {
public List<int> Numbers { get; set; }
}
var foo = new Foo { Numbers = { 1, 2, 3 } };
Run Code Online (Sandbox Code Playgroud)
这不会初始化List.它只调用Add.
你真的必须看到new MyObject() { X = 1, Y = 2 }两个不同的部分:
new MyObject()构造一个新对象并
{ X = 1, Y = 2 }设置其属性的值(这就是它所做的全部).
可以嵌套对象和集合初始值设定项.顶级初始值设定项必须遵循构造函数,但嵌套初始值设定项不能.
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |