C#:在单个语句中将相同的值分配给多个变量


161

有什么办法(出于好奇,因为我今天遇到了对多个变量的多个同值分配)在单个语句中一次将一个值分配给多个变量?

遵循以下原则(伪代码):

int num1 = 1;
int num2 = 1;

num1 & num2 = 5;

可能不是,但我认为值得一问,以防确实有可能发生类似的事情!

Answers:


258

就像这样简单:

num1 = num2 = 5;

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

例如,一个在每次调用getand set访问器时都写入控制台的类。

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;
        }
    }
}

这将输出

AccessorTest.Value.get 5
AccessorTest.Value.set 5
AccessorTest.Value.set 5

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


36
它实际上并不奇怪。逻辑如下:分配操作本身返回一个值,该值是已分配的值。执行的顺序为:num1 = (num2 = 5)并且执行的第一个赋值(num2 = 5)将值5返回给外界-依次将其赋给num1。此功能可无限进行(num0 = num1 = num2 = 5)。
Jpsy 2012年

如果要测试,请尝试Console.WriteLine(num = 5);。(免责声明:我尚未)
Arlen Beiler

3
问题:这被认为是不良做法num1 = num2 = 5吗?如果涉及更多变量,是否会使代码变得不可读?很抱歉,我不想为此而创建一个新帖子。
johnildergleidisson

没有正确的答案。我在程序中很少使用它,因此可以避免使用它。
Pierre-Alain Vigeant

我假设是编码风格。谢谢回复。
johnildergleidisson

54

这确实要您想要:

int num1, num2;
num1 = num2 = 5;

“ num2 = 5”分配将返回分配的值。

这使您可以做一些疯狂的事情,例如num1 = (num2 = 5) +3;将num1分配为8,尽管我不建议这样做,因为它不易读。


它不起作用了。
Aurelien B

33
int num1=5,num2=5

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


这是一个还是两个陈述?
Merin Nakarmi '17

很好的答案,但是当“ 5”是一个长字符串常量时,看起来很奇怪。 string a = "really long string", b = "really long string";
亚历克斯

13

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

int num1, num2 = num1 = 1;

我认为这是最好的答案,因为初始化和赋值都可以在单个语句中完成。
Sachin Parashar

11

试试这个:

num1 = num2 = 5;

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


1
您是否知道VB开发人员是否有其他语法,或者VB中根本不提供多重分配?
ckittel 2011年

3
@cki:AFAIK,不支持。
Slaks 2011年

VB中的@ckittel =用于赋值和相等性,因此num1 = num2 = 5意味着“赋值布尔值是否等于5等于num2变量num1”。由于=运算符具有这两种含义,因此无法表示此语法。最好的办法是创建一个函数,该函数接受多个参数byref以及一个值,并将所有参数分配给该值。
Servy


5
int num1, num2, num3;

num1 = num2 = num3 = 5;

Console.WriteLine(num1 + "=" + num2 + "=" + num3);    // 5=5=5


5

您的示例为:

int num1 = 1;
int num2 = 1;

num1 = num2 = 5;


0

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

var (a, b, c) = (1, 2, 3);

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.