C#组中变量的赋值

C#组中变量的赋值,c#,.net,C#,.net,什么样的C#特性(如果有)允许您编写如下代码: (a、b、c)=(3、4、5)这是C#7中引入的新元组语法 您需要首先声明变量,除非该语句前面使用var编写,否则这两个语句中的任何一个都可以: var (a, b, c) = (3, 4, 5); 或: 这两者将相当于: int a = 3; int b = 4; int c = 5; 请注意,这并没有构造元组,它使用C#7获得的新元组语法,因此编译的IL实际上与上面的最后一段代码相同(向下滚动以证明这一点) 元组被添加到了.NET Fram

什么样的C#特性(如果有)允许您编写如下代码:
(a、b、c)=(3、4、5)

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

您需要首先声明变量,除非该语句前面使用
var
编写,否则这两个语句中的任何一个都可以:

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

这两者将相当于:

int a = 3;
int b = 4;
int c = 5;
请注意,这并没有构造元组,它使用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指令中获益,但编写C#代码很难。上述交换(使用元组语法)编译为:

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

为了证明我前面提到的两段代码确实是相同的,我在中执行了以下代码,然后检查了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         
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:调用LINQPad.Extensions.Dump IL_0005:调用LINQPad.Extensions.Dump
IL_000A:pop IL_000A:pop
IL_000B:ldloc.0//b IL_000B:ldloc.0//b
IL_000C:调用LINQPad.Extensions.Dump IL_000C:调用LINQPad.Extensions.Dump
IL_0011:pop IL_0011:pop
IL_0012:ldloc.1//c IL_0012:ldloc.1//c
IL_0013:调用LINQPad.Extensions.Dump IL_0013:调用LINQPad.Extensions.Dump
IL_0018:pop IL_0018:pop
IL_0019:ret IL_0019:ret

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

您需要首先声明变量,除非该语句前面使用
var
编写,否则这两个语句中的任何一个都可以:

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

这两者将相当于:

int a = 3;
int b = 4;
int c = 5;
请注意,这并没有构造元组,它使用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指令中获益,但编写C#代码很难。上述交换(使用元组语法)编译为:

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

为了证明我前面提到的两段代码确实是相同的,我在中执行了以下代码,然后检查了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         
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:调用LINQPad.Extensions.Dump IL_0005:调用LINQPad.Extensions.Dump
IL_000A:pop IL_000A:pop
IL_000B:ldloc.0//b IL_000B:ldloc.0//b
IL_000C:调用LINQPad.Extensions.Dump IL_000C:调用LINQPad.Extensions.Dump
IL_0011:pop IL_0011:pop
IL_0012:ldloc.1//c IL_0012:ldloc.1//c
IL_0013:调用LINQPad.Extensions.Dump IL_0013:调用LINQPad.Extensions.Dump
IL_0018:pop IL_0018:pop
IL_0019:ret IL_0019:ret

您可以用三种方式赋值,您想要的是