C #: attribuer la même valeur à plusieurs variables dans une seule instruction


161

Existe-t-il un moyen (juste par curiosité parce que je suis tombé sur plusieurs affectations de même valeur à plusieurs variables aujourd'hui) en C # pour attribuer une valeur à plusieurs variables à la fois dans une seule instruction?

Quelque chose dans ce sens (pseudocode):

int num1 = 1;
int num2 = 1;

num1 & num2 = 5;

Probablement pas, mais j'ai pensé que cela valait la peine de demander au cas où quelque chose de similaire serait réellement possible!

Réponses:


259

C'est aussi simple que:

num1 = num2 = 5;

Lors de l'utilisation d'une propriété d'objet au lieu d'une variable, il est intéressant de savoir que l' getaccesseur de la valeur intermédiaire n'est pas appelé. Seul l' setaccesseur est appelé pour toutes les propriétés accédées dans la séquence d'attribution.

Prenez par exemple une classe qui écrit dans la console à chaque fois que l' accesseur getet setest appelé.

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

Cela produira

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

Cela signifie que le compilateur attribuera la valeur à toutes les propriétés et qu'il ne relira pas la valeur à chaque fois qu'elle est affectée.


36
Ce n'est pas bizarre en fait. La logique est la suivante: L'opération d'affectation elle-même renvoie une valeur, qui est la valeur qui a été affectée. La séquence d'exécution est la suivante: num1 = (num2 = 5)et la première affectation exécutée ( num2 = 5) renvoie la valeur 5 au monde extérieur - qui est à son tour affectée à num1. Cela fonctionne à l'infini ( num0 = num1 = num2 = 5).
Jpsy

Si vous voulez le tester, essayez Console.WriteLine(num = 5);. (Avertissement: je ne l'ai pas encore)
Arlen Beiler

3
Question: Est-ce considéré comme une mauvaise pratique num1 = num2 = 5? Est-ce que cela rend le code illisible si plus de variables sont impliquées? Désolé de détourner, je ne voulais pas créer un nouveau message juste pour cela.
johnildergleidisson

Il n'y a pas de réponse correcte. Je ne l'utilise que rarement dans mon programme et j'aurais pu l'éviter.
Pierre-Alain Vigeant

J'assume alors le style de codage. Merci pour la réponse.
johnildergleidisson

54

Cela fera ce que vous voulez:

int num1, num2;
num1 = num2 = 5;

L'affectation «num2 = 5» renverra la valeur attribuée.

Cela vous permet de faire des choses folles comme num1 = (num2 = 5) +3;qui attribueront 8 à num1, bien que je ne recommande pas de le faire car ce n'est pas très lisible.


Il ne fonctionne plus.
Aurelien B le

33
int num1=5,num2=5

Déclarer et affecter des variables dans la même instruction.


S'agit-il d'une seule déclaration ou de deux déclarations?
Merin Nakarmi

excellente réponse, mais semble bizarre quand "5" est une longue constante de chaîne. string a = "really long string", b = "really long string";
Alex

13

Quelque chose d'un peu plus court dans la syntaxe mais reprenant ce que les autres ont déjà dit.

int num1, num2 = num1 = 1;

Je pense que c'est la meilleure réponse car l'initialisation et l'affectation peuvent être effectuées en une seule instruction.
Sachin Parashar le

11

Essaye ça:

num1 = num2 = 5;

Notez que cela ne fonctionnera pas dans VB.


1
Savez-vous s'il existe une syntaxe alternative pour les développeurs VB, ou si l'affectation multiple n'est tout simplement pas disponible dans VB?
ckittel

3
@cki: AFAIK, ce n'est pas pris en charge.
SLaks

@ckittel In VB =est utilisé à la fois pour l'affectation et l'égalité, cela num1 = num2 = 5signifierait donc "attribuer le résultat booléen de savoir si cinq est égal ou non num2à la variable num1". Étant donné que l' =opérateur a ces deux significations, il n'existe aucun moyen de représenter cette syntaxe. Le mieux que vous puissiez faire est de créer une fonction qui prend en compte un certain nombre de paramètres byrefainsi qu'une valeur et qui affecte tous les paramètres à cette valeur.
Servy


5
int num1, num2, num3;

num1 = num2 = num3 = 5;

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


5

Votre exemple serait:

int num1 = 1;
int num2 = 1;

num1 = num2 = 5;


0

C'est maintenant une chose en C #:

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

En faisant ce qui précède, vous avez essentiellement déclaré trois variables. a = 1, b = 2et c = 3. Le tout sur une seule ligne.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.