C# select new T()和LINQ中select new T之间有区别吗

C# select new T()和LINQ中select new T之间有区别吗,c#,linq,datatable,C#,Linq,Datatable,我今天一直在试验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

我今天一直在试验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")
               };
得出了一个奇怪的结论,不管我选择new Foo还是new Foo,查询的效果都是一样的。我真的很想和代表们一起深入了解linq机制等,以清楚地理解这一点——但就目前而言,对于一个简单的人来说——有什么区别吗?如果有,这会是什么

编辑 这个问题在SOF上已经有了一些类似的答案,但对象初始值设定项并没有出现在脑海中。它也是针对LINQ提出的,在LINQ中,90%的web提示操作匿名类型不知道为什么,我发现使用具体类型,特别是Intellisense有一些好处。如果任何材料确实指定了具体类型,那么LINQ中的实现示例我只能找到没有括号的新Foo。对于LINQ构造,特别是对于初学者来说,可能很难找到初始化对象、委托、谓词等的内容-至少对我来说是这样,希望至少有人会发现问题和回答很有用。

如果您使用了,并且没有将任何参数传递给构造函数,则可以省略括号。这两种说法是等价的

发件人:

如果对象创建表达式包含对象初始值设定项或集合初始值设定项,则可以省略构造函数参数列表和圆括号。省略构造函数参数列表和括号相当于指定空参数列表

这两个表达式在C中完全相同

new Foo
{
    Property1 = row1.Field<string>("Hey")
    Property2 = row2.Field<string>("Ho")
};

,而C神选择在C 3.0中这样做


在较大的示例中,select采用这种形式的表达式,由于对象初始值设定项表达式相同,因此较大的表达式也会产生相同的结果:

这两个答案都很好。谢谢你,我真的很难决定接受哪一个-1快,或2约翰·斯基特的例子真的对我有意义。我能问一个小的澄清问题吗-我不知何故对查询中的属性1不了解?这是正常的吗?如果你有括号或没有括号,IntelliSense的工作原理应该是一样的。。。也许只是你的IDE太慢了?谢谢你,John,Intellisense可以工作,太棒了@Jakub-无意冒犯,也谢谢你的回答,我不知何故无法抗拒约翰·斯基特;可能重复的
new Foo()
{
    Property1 = row1.Field<string>("Hey")
    Property2 = row2.Field<string>("Ho")
};