似乎C#3.0对象初始化程序语法允许在存在无参数构造函数时排除构造函数中的打开/关闭括号对.例:
var x = new XTypeName { PropA = value, PropB = value };
Run Code Online (Sandbox Code Playgroud)
相反:
var x = new XTypeName() { PropA = value, PropB = value };
Run Code Online (Sandbox Code Playgroud)
我很好奇为什么构造函数打开/关闭括号对后面是可选的XTypeName?
我今天一直在用LINQ和DataTable进行实验.
var query = from row1 in table1.AsEnumerable()
from row2 in table2.AsEnumerable()
where
(row1.Field<string>("a") == row2.Field<string>("b"))
select new Foo
{
Property1 = row1.Field<string>("Hey")
Property2 = row2.Field<string>("Ho")
};
Run Code Online (Sandbox Code Playgroud)
并得出奇怪的结论,无论我做什么select new Foo或select new Foo()查询工作完全相同.我真的希望与代表等进一步深入了解linq机制,以便清楚地理解这一点 - 但就目前而言,对于一个简单的人来说 - 是否存在差异,如果是这样,那会是什么?
编辑
问题在SOF上已有一些类似的答案,但"对象初始化程序"并不是最重要的.它也非常具体地针对LINQ,其中90%的网络提示操作匿名类型(不知道为什么,我发现使用具体类型的一些好处,特别是Intellisense).如果任何材料确实在LINQ中指定具体类型实现示例,我只能找到new Foo没有括号.使用LINQ构建尤其适合初学者,可能很难找到那里初始化的内容(对象,委托,谓词等 - 至少对我来说是这样)所以希望至少有些人会发现问题和响应很有用.