什么C#功能(如果有)允许您编写如下代码:
(a, b, c) = (3, 4, 5);
答案 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);