我在 MS 文档中发现了这种语法:

public NewsStoryViewModel(DateTimeOffset published, string title, string uri) =>
        (Published, Title, Uri) = (published, title, uri);

它在一个语句中进行多项赋值,但我不太确定它叫什么或它是如何工作的。

这是通过假装这些是元组来进行多重赋值的某种技巧还是它有自己的名字?

附言如果有人感兴趣,会提到 here

P.P.S.我想知道的不是 {} 的缺失,而是第 2 行的“花哨”分配而不是传统分配。

最佳答案

我不知道他们是否有专门在构造函数中执行此操作的官方术语,它被称为 deconstruction 作为通用模式。只要赋值的右侧有一个合适的 Deconstruct 方法,你就可以从一个类型中提取值,像这样批量执行赋值。对于元组,这个:

var (x, y, z) = (1, 2, 3);

在道德上等同于
var tuple = (1, 2, 3);
var x = tuple.Item1;
var y = tuple.Item2;
var z = tuple.Item3;

左侧可以有任何可分配的变量,它们可以是构造函数中的局部变量、字段或仅获取属性。使用它是个人喜好和代码风格,我通常像在 MSDN 文档中一样使用它们 - 在一行中编写基本的构造函数:
class C
{
    private int Prop1 { get; }
    private D Prop2 { get; }
    private string Prop3 { get; }

    public C(int prop1, D prop2, string prop3) =>
        (Prop1, Prop2, Prop3) = (prop1, prop2, prop3);
}

一个有趣的事实是 Roslyn 编译器识别这种模式并避免实际创建元组。如果将其放入反编译器,您将看到生成的代码与 for 相同:

public C(int prop1, D prop2, string prop3)
{
    Prop1 = prop1;
    Prop2 = prop2;
    Prop3 = prop3;
}

我不知道它是否在任何地方都有记录,但要归功于 Jon Skeet,他在他的 C# in Depth(第 4 版)中提到了这一点。

更新:
出于好奇,我检查了优化是否也适用于其他地方。只要左侧变量是 refout 参数,它似乎就可以工作。例如这个:

public void Deconstruct(out int prop1, out object prop2, out string prop3) =>
    (prop1, prop2, prop3) = (_prop1, _prop2, _prop3);

生成与此等效的代码:

public void Deconstruct(out int prop1, out object prop2, out string prop3)
{
    int temp1 = _prop1;
    object temp2 = _prop2;
    string temp3 = _prop3;
    prop1 = temp1;
    prop2 = temp2;
    prop3 = temp3;
}

我有根据的猜测是,由于 IL 对“正常”变量和 ref 变量的赋值不同,因此对于第二种情况根本没有实现优化,但我可能是错的。

关于c# - C#(类似于多个元组的赋值)中此语法的名称是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59532145/

10-13 06:49