C #: assegna lo stesso valore a più variabili in una singola istruzione


161

Esiste un modo (solo per curiosità perché mi sono imbattuto in più assegnazioni dello stesso valore a più variabili oggi) in C # per assegnare un valore a più variabili contemporaneamente in una singola istruzione?

Qualcosa del genere (pseudocodice):

int num1 = 1;
int num2 = 1;

num1 & num2 = 5;

Probabilmente no, ma ho pensato che valesse la pena chiedere nel caso in cui qualcosa di simile sia effettivamente possibile!

Risposte:


259

È semplice come:

num1 = num2 = 5;

Quando si utilizza una proprietà dell'oggetto anziché una variabile, è interessante sapere che getnon viene chiamato l' accessor del valore intermedio. setViene richiamato solo l' accessor per tutte le proprietà a cui si accede nella sequenza di assegnazione.

Prendiamo ad esempio una classe che scrive sulla console ogni volta getche setsi invocano l' accessor e .

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

Questo produrrà

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

Ciò significa che il compilatore assegnerà il valore a tutte le proprietà e non rileggerà il valore ogni volta che viene assegnato.


36
In realtà non è strano. La logica è la seguente: L'operazione di assegnazione stessa restituisce un valore, che è il valore che è stato assegnato. La sequenza di esecuzione è: num1 = (num2 = 5)e il primo incarico che viene eseguito ( num2 = 5) restituisce il valore 5 al mondo esterno - che a sua volta è assegnato a num1. Funziona all'infinito ( num0 = num1 = num2 = 5).
Jpsy,

Se vuoi provarlo, prova Console.WriteLine(num = 5);. (Dichiarazione di non responsabilità: non l'ho ancora fatto)
Arlen Beiler

3
Domanda: questa è considerata una cattiva pratica num1 = num2 = 5? Rende illeggibile il codice se sono coinvolte più variabili? Mi dispiace dirottare, non volevo creare un nuovo post solo per questo.
johnildergleidisson,

Non c'è una risposta corretta. Lo uso solo appena nel mio programma e avrei potuto evitarlo.
Pierre-Alain Vigeant,

In base allo stile di programmazione presumo quindi. Grazie per la risposta.
johnildergleidisson,

54

Questo vorrà che tu voglia:

int num1, num2;
num1 = num2 = 5;

L'assegnazione 'num2 = 5' restituirà il valore assegnato.

Questo ti permette di fare cose folli come quelle num1 = (num2 = 5) +3;che assegneranno 8 a num1, anche se non consiglierei di farlo perché non è molto leggibile.


Non funziona più
Aurelien B,

33
int num1=5,num2=5

Dichiarazione e assegnazione di variabili nella stessa istruzione.


È una singola affermazione o due affermazioni?
Merin Nakarmi, il

ottima risposta, ma sembra strano quando "5" è una costante di stringa lunga. string a = "really long string", b = "really long string";
Alex

13

Qualcosa di un po 'più breve in sintassi ma prendendo quello che gli altri hanno già affermato.

int num1, num2 = num1 = 1;

Penso che questa sia la risposta migliore perché sia ​​l'inizializzazione che l'assegnazione possono essere eseguite in un'unica istruzione.
Sachin Parashar,

11

Prova questo:

num1 = num2 = 5;

Nota che questo non funzionerà in VB.


1
Sai se esiste una sintassi alternativa per gli sviluppatori VB o l'assegnazione multipla non è semplicemente disponibile in VB?
ckittel,

3
@cki: AFAIK, non è supportato.
SLaks,

@ckittel In VB =è usato sia per assegnazione che per uguaglianza, quindi num1 = num2 = 5significherebbe "assegnare il risultato booleano se cinque è uguale o meno num2alla variabile num1". Poiché l' =operatore ha questi due significati, non c'è modo di rappresentare questa sintassi. Il meglio che puoi fare è creare una funzione che abbia preso un numero di parametri byrefe un valore e che abbia assegnato tutti i parametri a quel valore.
Servito il


5
int num1, num2, num3;

num1 = num2 = num3 = 5;

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


5

Il tuo esempio sarebbe:

int num1 = 1;
int num2 = 1;

num1 = num2 = 5;


0

Questo è ora qualcosa in C #:

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

Effettuando quanto sopra, hai sostanzialmente dichiarato tre variabili. a = 1, b = 2E c = 3. Tutto in una sola riga.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.