C#:在单个语句中为多个变量赋值

Ale*_*lex 147 c#

有没有办法(出于好奇,因为我今天遇到了多个相同值的多个变量赋值)在C#中在一个语句中一次为一个多个变量分配一个值?

沿着这些方向的东西(伪代码):

int num1 = 1;
int num2 = 1;

num1 & num2 = 5;
Run Code Online (Sandbox Code Playgroud)

可能不是,但我认为值得询问,以防有类似的事情真的可能!

Pie*_*ant 240

它很简单:

num1 = num2 = 5;
Run Code Online (Sandbox Code Playgroud)

当使用对象属性而不是变量时,有趣的是知道get不调用中间值的访问者.仅为set分配序列中访问的所有属性调用访问器.

例如,每次调用getset访问器时写入控制台的类.

static void Main(string[] args)
{
    var accessorSource = new AccessorTest(5);
    var accessor1 = new AccessorTest();
    var accessor2 = new AccessorTest();

    accessor1.Value = accessor2.Value = accessorSource.Value;

    Console.ReadLine();
}

public class AccessorTest
{
    public AccessorTest(int value = default(int))
    {
        _Value = value;
    }

    private int _Value;

    public int Value
    {
        get
        {
            Console.WriteLine("AccessorTest.Value.get {0}", _Value);
            return _Value;
        }
        set
        {
            Console.WriteLine("AccessorTest.Value.set {0}", value);
            _Value = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将输出

AccessorTest.Value.get 5
AccessorTest.Value.set 5
AccessorTest.Value.set 5
Run Code Online (Sandbox Code Playgroud)

这意味着编译器会将值分配给所有属性,并且每次分配时都不会重新读取该值.

  • 实际上并不奇怪.逻辑如下:赋值操作本身返回一个值,该值是已分配的值.执行的顺序是:``num1 =(num2 = 5)``并且执行的第一个赋值(``num2 = 5``)将值5返回给外界 - 然后将其分配给num1.这无限无效(``num0 = num1 = num2 = 5``). (33认同)
  • 问题:这被认为是不好的做法`num1 = num2 = 5`吗?如果涉及更多变量,它是否会使代码不可读?抱歉劫持,我不想只为它创建一个新帖子。 (3认同)

aar*_*onb 54

这将是你想要的:

int num1, num2;
num1 = num2 = 5;
Run Code Online (Sandbox Code Playgroud)

'num2 = 5'赋值将返回指定的值.

这允许你做疯狂的事情,如num1 = (num2 = 5) +3;将分配8到num1,虽然我不建议这样做,因为不是非常可读.


Zai*_*Ali 31

int num1=5,num2=5
Run Code Online (Sandbox Code Playgroud)

在同一语句中声明和分配变量.

  • 这是一个陈述还是两个陈述? (2认同)

SLa*_*aks 11

试试这个:

num1 = num2 = 5;
Run Code Online (Sandbox Code Playgroud)

请注意,这在VB中不起作用.

  • @cki:AFAIK,它不受支持. (3认同)

Dan*_*iel 7

num1 = num2 = 5


Rik*_*kki 7

这现在是 C# 中的一件事:

var (a, b, c) = (1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

通过执行上述操作,您基本上已经声明了三个变量。a = 1b = 2c = 3。全部在一行中。

  • https://learn.microsoft.com/en-us/dotnet/csharp/deconstruct “从 C# 7.0 开始,您可以从元组中检索多个元素,或在单个解构中从对象中检索多个字段、属性和计算值操作。当您解构一个元组时,您将其元素分配给各个变量。当您解构一个对象时,您将选定的值分配给各个变量。” (4认同)
  • 哇哦,不知道这个。您能提供文档链接吗? (3认同)
  • 今天早上,我的一位同事在演示中展示了一些使用此语法的代码。我自 2003 年以来一直在编写 C#,但这对我来说是新鲜事。感谢您的评论以及文档链接。 (2认同)
  • 不要忘记元组成员可以有不同的类型,所以这也有效: var (d, i, s) = (6.28, 42, "Hello"); (2认同)

小智 6

语法短一些,但采用其他人已经说过的。

int num1, num2 = num1 = 1;
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是最好的答案,因为初始化和赋值都可以在一条语句中完成。 (4认同)

Luk*_*keH 5

int num1, num2, num3;

num1 = num2 = num3 = 5;

Console.WriteLine(num1 + "=" + num2 + "=" + num3);    // 5=5=5
Run Code Online (Sandbox Code Playgroud)


Roh*_*est 5

像这样的东西.

num1 = num2 = 5
Run Code Online (Sandbox Code Playgroud)


Dru*_*uid 5

您的示例将是:

int num1 = 1;
int num2 = 1;

num1 = num2 = 5;
Run Code Online (Sandbox Code Playgroud)