【问题标题】:Is there a difference between select new T() and select new T in LINQselect new T() 和 select new T in LINQ 有区别吗
【发布时间】:2015-12-31 20:01:17
【问题描述】:

我今天一直在试验 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% 的 Web 提示在匿名类型上运行(不知道为什么,我发现使用具体类型有一些好处,尤其是 Intellisense)。如果任何材料确实在 LINQ 中指定了具体的类型实现示例,我只能找到不带括号的 new Foo 。使用 LINQ 构造,尤其是对于初学者来说,找出那里初始化的内容(对象、委托、谓词等 - 至少对我来说)可能会很棘手,所以希望至少有些人会发现问题和响应很有用。

【问题讨论】:

  • 两个很好的答案。谢谢,我真的很难决定接受哪一个 - 1 更快,或者 2 来自 John Skeet 的例子真的对我说话。
  • 我能问一个澄清的小问题吗 - 我不知何故没有得到智能感知,例如查询中的 Property1 ?这正常吗?
  • 无论是否有括号,IntelliSense 应该都能正常工作......也许只是你的 IDE 很慢?
  • 谢谢约翰,Intellisense 工作,太棒了! @Jakub - 无意冒犯,也感谢您的回答,我不知何故无法抗拒 John Skeet ;)

标签: c# linq datatable


【解决方案1】:

这两个表达式一模一样在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")
};

because Jon said soMr. Lippert tells us why C# 大神们选择在 C# 3.0 中这样做

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

【讨论】:

    【解决方案2】:

    如果您使用object initializer 并且不向构造函数传递任何参数,则可以省略括号。两个语句是等价的。

    来自C# language specification

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      相关资源
      最近更新 更多