C#中类似于C++结构化绑定的方法是什么?

3

在 C++17 中,有一个非常巧妙的功能叫做结构化绑定。我很难找到它在 C# 中的类比。具体来说,我的代码大致如下所示:

public struct A
{
public int up;
public int down;
public int left;
public int right;
};
public abstract A foo();
A a = foo();
int up=a.up;
int down=a.down;
int left=a.left;
int right=a.right;

我希望以更简洁的方式初始化这些变量。谢谢您提前的帮助。

4
您可能正在寻找析构 - madreflection
最接近的方法可能是使用反射在循环中获取您结构体的值,但这可能更加冗长。我想不出C#中还有其他任何可以以这种方式工作的东西,我敢打赌C++通过某种BitBlt /块传输方式来实现;如果是这样,那种类型的内容对于C#完全陌生。 - ShakespearesMonkey
你可能会考虑使用MemberwiseClone,它在每个类和结构中都有默认实现。这与您的要求类似,但不会给您单独操作的变量,只是原始结构的副本(前提是将其从默认的object数据类型转换为A)。 - ShakespearesMonkey
@Lev - 我只是根据你的例子来判断,所以我不确定(我对C++不是很熟悉),但现在我非常确定了。在这个页面的第一个例子中,C++中的语句auto [x,y,z] = f();在C#中应该是var (x,y,z) = f();。解构绝对是你想要的。只需记住,在C#中它并不是开箱即用的。 - madreflection
1个回答

0

你可以做:

using System;

public struct A
{
    public int up;
    public int down;
    public int left;
    public int right;
    
    public void Deconstruct(out int up, out int down, out int left, out int right)
    {
        up = this.up;
        down = this.down;
        left = this.left;
        right = this.right;
    }
};

public static class M {
    public static void main() {
        var (up,down,left,right) = new A();
    }
}

或者在 C# 10 中:

using System;

record struct A(int up, int down, int left, int right);

public static class M {
    public static void main() {
        var (up,down,left,right) = new A();
    }
}

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