【问题标题】:Understanding this expression body definition理解这个表达式主体定义
【发布时间】:2020-08-09 07:37:35
【问题描述】:

我遇到了这段代码:

    private class Node
    {
        public Node(T t) => (Next, Data) = (null, t);

        public Node Next { get; set; }
        public T Data { get; set; }
    }

有人能解释一下这在构造函数中是什么意思吗?

public Node(T t) => (Next, Data) = (null, t);

我不知道这是什么意思

(Next, Data) = (null, t);

【问题讨论】:

  • @dxiv:总的来说,它是一个表达式体构造函数,但(Next, Data) = (null, t); 部分并不特定于表达式体构造函数——它恰好经常与它们一起使用。
  • @JonSkeet 是的,当然,感谢您直截了当。

标签: c#


【解决方案1】:

这是一种混合:

  • 元组文字((null, t) 部分)
  • deconstruction(Next, Data) = ... 部分)

实际上是这样的:

public Node(T t)
{
    Next = null;
    Data = t;
}

...但写成单个赋值表达式,这意味着您可以将其用作表达式体成员。

您第一次看到它时会觉得很奇怪,但是当您习惯它时,这是一种奇妙编写简单构造函数的方式,该构造函数只是将参数值复制到字段和属性中。

【讨论】:

  • 他们为什么不能这样做? public Node(T t) => Next =null; Data = t; 还是无效的表达式主体?
  • @MistyD:是的,这是无效的,因为这是两个陈述。为此,您需要一个常规的块体。是的,你绝对可以这样做......只是更冗长。
  • 解构时是否会影响性能,或者与旧方法的性能相同?
  • @EfthymiosKalyviotis:我相信编译器实际上可以识别这种特殊模式并发出与“旧式”代码完全相同的 IL。
  • 出于好奇,我尝试使用 JetBrains DotPeek 对这两种情况进行反编译,结果略有不同(尽管我不知道如何比较 IL)。 imgur.com/a/a1UU25L
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 2017-04-29
  • 2011-05-06
相关资源
最近更新 更多