在LINQ中,使用"select new T()"和"select new T"有什么区别吗?

3

今天我在尝试使用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")
               };

我发现无论我使用 select new Foo 还是 select new Foo(),查询的结果都完全相同,这让我感到很奇怪。我想深入了解 Linq 的机制,包括委托等内容,以便更清楚地理解这一点 - 但是对于一个简单的人来说,有什么区别,如果有的话,会是什么呢? 编辑 这个问题在 SOF 上已经有了一些类似的答案,但“对象初始化程序”并没有成为头脑中的首选项。它也非常具体地提到了 LINQ,其中 90% 的网络提示操作都是针对匿名类型(不确定为什么,我发现使用具体类型有很好的效果,尤其是智能感知)。如果有任何材料专门指定在 LINQ 中使用具体类型实现的示例,我只能找到没有括号的 new Foo。在 LINQ 构造方面,特别是对于初学者来说,可能很难找出那里初始化了什么(对象、委托、谓词等等-至少对我来说是这样),所以希望至少有些人会发现这个问题和回答有用。

两个答案都很好。谢谢你们,我真的很难决定接受哪一个——第一个更快,还是第二个John Skeet的例子更能说服我。 - Turo
我可以问一个小的澄清问题吗 - 我在查询中无法获得例如 Property1 的智能感知?这是正常的吗? - Turo
IntelliSense应该在有或没有括号的情况下都能正常工作...也许只是你的IDE运行缓慢了? - Frank Bryce
谢谢你,John。智能感知很好用,太棒了!@Jakub - 没有冒犯的意思,也谢谢你的回答,但我不知道为什么抵挡不住 John Skeet 的魅力 ;) - Turo
2
可能是 在C#中通过这两种方式初始化对象的区别 的重复问题。 - Vadim Martynov
2个回答

10

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

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

new Foo()
{
    Property1 = row1.Field<string>("Hey")
    Property2 = row2.Field<string>("Ho")
};
因为Jon这么说,以及Lippert 先生告诉我们为什么 C# 神在 C# 3.0 中选择了这样做。在您的更大示例中,select 接受此形式的表达式,并且由于对象初始化程序表达式相同,则较大的表达式也产生相同的结果 :)

6
如果您使用 对象初始化器 并且不向构造函数传递任何参数,则可以省略括号。这两个语句是等效的。
来自C#语言规范

一个对象创建表达式可以省略构造函数参数列表和括号,前提是它包括对象初始化器或集合初始化器。省略构造函数参数列表和括号等同于指定空参数列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接