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.