组中的C#变量分配

时间:2018-06-22 11:30:19

标签: c# .net

什么C#功能(如果有)允许您编写如下代码: (a, b, c) = (3, 4, 5);

2 个答案:

答案 0 :(得分:15)

这是C#7中引入的新元组语法。

您将需要先声明变量,除非该语句的前面写有var,所以这两种方法都可以工作:

var (a, b, c) = (3, 4, 5);

或:

int a, b, c;
(a, b, c) = (3, 4, 5);

这两个都等同于:

int a = 3;
int b = 4;
int c = 5;

请注意,这不会构造一个 tuple ,它使用了C#7获得的新元组语法,因此编译后的IL实际上与上面的最后一段代码相同(向下滚动以证明这一点。)

已将问题添加到.NET Framework 4.7.1和.NET Core 2.1(我认为),或者如果您使用的是.NET Framework / Core / Standard较旧的版本,则通过nuget软件包添加了。

但是,新的语法和元组的概念也已添加到C#中,既是构造这些元组 实例的一种花哨的语法,但 C#语言的核心概念

例如,要交换两个(相同类型的)变量的内容,您现在可以使用以下语法:

(x, y) = (y, x);

这不会构造新的元组实例,并且在功能上与此相同:

var temp = x;
x = y;
y = x;

尽管在这里编译器可以从访问IL指令中受益,而IL指令很难为其编写C#代码。上面的交换(使用元组语法)被编译为此:

ldarg.2
ldarg.1
starg.s 02 // store v1 into v2
starg.s 01 // store v2 into v1

为了证明我之前提到的两段代码确实是相同的,我在LINQPad中执行了以下代码,然后检查了LINQPad可以显示的IL,我并排放置了这两种方法,因此您可以看到相似之处:

public void Test1()
{
    int a, b, c;
    (a, b, c) = (3, 4, 5);

    a.Dump();
    b.Dump();
    c.Dump();
}

public void Test2()
{
    int a = 3;
    int b = 4;
    int c = 5;

    a.Dump();
    b.Dump();
    c.Dump();
}

IL输出:

Test1:                                                           Test2:
IL_0000:  ldc.i4.3                                               IL_0000:  ldc.i4.3    
IL_0001:  ldc.i4.4                                               IL_0001:  ldc.i4.4    
IL_0002:  stloc.0     // b                                       IL_0002:  stloc.0     // b
IL_0003:  ldc.i4.5                                               IL_0003:  ldc.i4.5    
IL_0004:  stloc.1     // c                                       IL_0004:  stloc.1     // c
IL_0005:  call        LINQPad.Extensions.Dump<Int32>             IL_0005:  call        LINQPad.Extensions.Dump<Int32>
IL_000A:  pop                                                    IL_000A:  pop         
IL_000B:  ldloc.0     // b                                       IL_000B:  ldloc.0     // b
IL_000C:  call        LINQPad.Extensions.Dump<Int32>             IL_000C:  call        LINQPad.Extensions.Dump<Int32>
IL_0011:  pop                                                    IL_0011:  pop         
IL_0012:  ldloc.1     // c                                       IL_0012:  ldloc.1     // c
IL_0013:  call        LINQPad.Extensions.Dump<Int32>             IL_0013:  call        LINQPad.Extensions.Dump<Int32>
IL_0018:  pop                                                    IL_0018:  pop         
IL_0019:  ret                                                    IL_0019:  ret         

答案 1 :(得分:0)

您可以通过3种方式分配值,您想要的基本上是在python中而不是在c#中工作

第一个

int a,b,c;// and so on.
a=b=c=1;

另一种方式

int a=1,b=2,c=3;

或者您可以引用元组

var (a, b, c) = (3, 4, 5);