当前位置:  开发笔记 > 编程语言 > 正文

选择新T()和在LINQ中选择新T之间是否存在差异

如何解决《选择新T()和在LINQ中选择新T之间是否存在差异》经验,为你挑选了2个好方法。

我今天一直在用LINQ和DataTable进行实验.

var query = from row1 in table1.AsEnumerable()
            from row2 in table2.AsEnumerable()
            where
            (row1.Field("a") == row2.Field("b"))

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

并得出奇怪的结论,无论我做什么select new Fooselect new Foo()查询工作完全相同.我真的希望与代表等进一步深入了解linq机制,以便清楚地理解这一点 - 但就目前而言,对于一个简单的人来说 - 是否存在差异,如果是这样,那会是什么?

编辑 问题在SOF上已有一些类似的答案,但"对象初始化程序"并不是最重要的.它也非常具体地针对LINQ,其中90%的网络提示操作匿名类型(不知道为什么,我发现使用具体类型的一些好处,特别是Intellisense).如果任何材料确实在LINQ中指定具体类型实现示例,我只能找到new Foo没有括号.使用LINQ构建尤其适合初学者,可能很难找到那里初始化的内容(对象,委托,谓词等 - 至少对我来说是这样)所以希望至少有些人会发现问题和响应很有用.



1> Frank Bryce..:

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

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

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

因为Jon这么说,Lippert先生告诉我们为什么 C#众神选择在C#3.0中做到这一点

在您的大型示例中,select采用此表单的表达式,并且由于对象初始值设定项表达式相同,因此较大的表达式也会产生相同的结果:)



2> Jakub Lortz..:

如果使用对象初始值设定项并且未将任何参数传递给构造函数,则可以省略括号.两个陈述都是等同的.

从C#语言规范:

对象创建表达式可以省略构造函数参数列表并括起括号,前提是它包含对象初始值设定项或集合初始值设定项.省略构造函数参数列表并括起括号等效于指定空参数列表.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有