C#组中变量的赋值
什么样的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
(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
您可以用三种方式赋值,您想要的是