C #: atribua o mesmo valor a várias variáveis ​​na única instrução


161

Existe alguma maneira (apenas por curiosidade, porque me deparei com várias atribuições de mesmo valor para várias variáveis ​​hoje) no C # para atribuir um valor a várias variáveis ​​ao mesmo tempo em uma única instrução?

Algo nesse sentido (pseudocódigo):

int num1 = 1;
int num2 = 1;

num1 & num2 = 5;

Provavelmente não, mas pensei que valeria a pena perguntar se algo semelhante é realmente possível!

Respostas:


258

É tão simples quanto:

num1 = num2 = 5;

Ao usar uma propriedade de objeto em vez de variável, é interessante saber que o getacessador do valor intermediário não é chamado. Apenas oset acessador é chamado para todas as propriedades acessadas na sequência de atribuição.

Tomemos, por exemplo, uma classe que grava no console toda vez que o acessador gete seté invocado.

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

Isso produzirá

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

Significando que o compilador atribuirá o valor a todas as propriedades e não o relerá toda vez que for atribuído.


36
Na verdade, não é estranho. A lógica é a seguinte: A própria operação de atribuição retorna um valor, que é o valor que foi atribuído. A sequência de execução é: num1 = (num2 = 5)e a primeira atribuição executada ( num2 = 5) retorna o valor 5 para o mundo externo - que, por sua vez, é atribuído a num1. Isso funciona ad infinitum ( num0 = num1 = num2 = 5).
Jpsy

Se você quiser testá-lo, tente Console.WriteLine(num = 5);. (Disclaimer: Eu não tenho ainda)
Arlen Beiler

3
Pergunta: Isso é considerado uma má prática num1 = num2 = 5? Torna o código ilegível se houver mais variáveis ​​envolvidas? Desculpe invadir, eu não queria criar uma nova postagem apenas para ela.
johnildergleidisson

Não há resposta correta. Eu o uso apenas pouco no meu programa e poderia ter evitado.
Pierre-Alain Vigeant

Abaixo o estilo de codificação, eu assumo então. Obrigado pela resposta.
Johérergleidisson

54

Isso fará com que você queira:

int num1, num2;
num1 = num2 = 5;

A atribuição 'num2 = 5' retornará o valor atribuído.

Isso permite que você faça coisas malucas como a num1 = (num2 = 5) +3;que atribuirá 8 a num1, embora eu não recomendei fazer isso por não ser muito legível.


Isso não funciona mais.
Aurelien B

33
int num1=5,num2=5

Declarando e atribuindo variáveis ​​na mesma instrução.


Esta é uma declaração única ou duas declarações?
Merin Nakarmi

ótima resposta, mas parece estranha quando "5" é uma constante de cadeia longa. string a = "really long string", b = "really long string";
28418 Alex

13

Algo um pouco mais curto na sintaxe, mas usando o que os outros já declararam.

int num1, num2 = num1 = 1;

Eu acho que essa é a melhor resposta, porque a inicialização e a atribuição podem ser feitas em uma única declaração.
Sachin Parashar

11

Tente o seguinte:

num1 = num2 = 5;

Observe que isso não funcionará no VB.


1
Você sabe se existe alguma sintaxe alternativa para desenvolvedores de VB ou se há várias atribuições simplesmente não disponíveis no VB?
ckittel

3
@cki: AFAIK, não é suportado.
SLaks

@ckittel No VB =é usado tanto para atribuição quanto para igualdade, então num1 = num2 = 5significaria "atribuir o resultado booleano de se cinco é igual ou não num2à variável num1". Como o =operador tem esses dois significados, não há como representar essa sintaxe. O melhor que você pode fazer é criar uma função que tenha vários parâmetros byrefe um valor e atribua todos os parâmetros a esse valor.
Servy


5
int num1, num2, num3;

num1 = num2 = num3 = 5;

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


5

Seu exemplo seria:

int num1 = 1;
int num2 = 1;

num1 = num2 = 5;


0

Agora isso é algo em C #:

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

Ao fazer o acima, você basicamente declarou três variáveis. a = 1, b = 2E c = 3. Tudo em uma única linha.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.