代码之家  ›  专栏  ›  技术社区  ›  AAA

分组变量赋值

  •  1
  • AAA  · 技术社区  · 8 年前

    什么样的c特性(如果有的话)允许您编写这样的代码: (a, b, c) = (3, 4, 5);

    2 回复  |  直到 8 年前
        1
  •  15
  •   Lasse V. Karlsen    8 年前

    这是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;
    

    注意,这并不构成 元组 ,它使用新的元组 句法 C 7得到的编译IL实际上与上面最后一段代码相同(向下滚动以证明这一点)。

    元组被添加到.net framework 4.7.1和.net core 2.1中(我认为),如果您使用的是旧的.net framework/core/standard版本,则可以通过nuget包添加元组。

    然而,新的语法和 概念 of元组也被添加到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 然后检查了Link Quad可以显示的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         
    
        2
  •  0
  •   Mr. Roshan    8 年前

    你可以用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);
    
    推荐文章