C #: Weisen Sie mehreren Variablen in einer einzelnen Anweisung denselben Wert zu


161

Gibt es in C # eine Möglichkeit (nur aus Neugier, weil ich heute auf mehrere Variablen mit demselben Wert für mehrere Variablen gestoßen bin), einen Wert mehreren Variablen gleichzeitig in einer einzelnen Anweisung zuzuweisen?

Etwas in diese Richtung (Pseudocode):

int num1 = 1;
int num2 = 1;

num1 & num2 = 5;

Wahrscheinlich nicht, aber ich dachte, es lohnt sich zu fragen, ob etwas Ähnliches tatsächlich möglich ist!

Antworten:


258

Es ist so einfach wie:

num1 = num2 = 5;

Wenn Sie eine Objekteigenschaft anstelle einer Variablen verwenden, ist es interessant zu wissen, dass der getAccessor des Zwischenwerts nicht aufgerufen wird. setFür alle Eigenschaften, auf die in der Zuweisungssequenz zugegriffen wird, wird nur der Accessor aufgerufen.

Nehmen Sie zum Beispiel eine Klasse, die bei jedem Aufruf von getund setaccessor in die Konsole schreibt .

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

Dies wird ausgegeben

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

Dies bedeutet, dass der Compiler den Wert allen Eigenschaften zuweist und den Wert nicht jedes Mal neu liest, wenn er zugewiesen wird.


36
Es ist eigentlich nicht komisch. Die Logik lautet wie folgt: Die Zuweisungsoperation selbst gibt einen Wert zurück, der der zugewiesene Wert ist. Die Reihenfolge der Ausführung ist: num1 = (num2 = 5)und die erste Ausführung, die ausgeführt wird ( num2 = 5), gibt den Wert 5 an die Außenwelt zurück - die wiederum num1 zugewiesen ist. Dies funktioniert ad infinitum ( num0 = num1 = num2 = 5).
Jpsy

Wenn Sie es testen möchten, versuchen Sie es Console.WriteLine(num = 5);. (Haftungsausschluss: Ich habe noch nicht)
Arlen Beiler

3
Frage: Wird dies als schlechte Praxis angesehen num1 = num2 = 5? Wird Code unlesbar, wenn mehr Variablen beteiligt sind? Tut mir leid, dass ich entführt habe, ich wollte keinen neuen Beitrag nur dafür erstellen.
Johnildergleidisson

Es gibt keine richtige Antwort. Ich benutze es nur selten in meinem Programm und hätte es vermeiden können.
Pierre-Alain Vigeant

Bis auf den Codierungsstil nehme ich dann an. Danke für die Antwort.
Johnildergleidisson

54

Dies wird wollen, dass Sie wollen:

int num1, num2;
num1 = num2 = 5;

Die Zuweisung 'num2 = 5' gibt den zugewiesenen Wert zurück.

Auf diese Weise können Sie verrückte Dinge tun, bei num1 = (num2 = 5) +3;denen num1 8 zugewiesen wird, obwohl ich nicht empfehlen würde, dies zu tun, da es nicht sehr lesbar ist.


Es geht nicht mehr.
Aurelien B

33
int num1=5,num2=5

Variablen in derselben Anweisung deklarieren und zuweisen.


Ist das eine einzelne Aussage oder zwei Aussagen?
Merin Nakarmi

Tolle Antwort, sieht aber komisch aus, wenn "5" eine lange String-Konstante ist. string a = "really long string", b = "really long string";
Alex

13

Etwas kürzer in der Syntax, aber unter Berücksichtigung dessen, was die anderen bereits gesagt haben.

int num1, num2 = num1 = 1;

Ich denke, dies ist die beste Antwort, da sowohl die Initialisierung als auch die Zuweisung in einer einzigen Anweisung erfolgen können.
Sachin Parashar

11

Versuche dies:

num1 = num2 = 5;

Beachten Sie, dass dies in VB nicht funktioniert.


1
Wissen Sie, ob es eine alternative Syntax für VB-Entwickler gibt oder ob Mehrfachzuweisungen in VB einfach nicht verfügbar sind?
ckittel

3
@cki: AFAIK, es wird nicht unterstützt.
SLaks

@ckittel In VB =wird sowohl für die Zuweisung als auch für die Gleichheit verwendet. num1 = num2 = 5Dies würde bedeuten, dass "das boolesche Ergebnis zugewiesen wird, ob fünf gleich num2der Variablen ist oder nicht num1". Da der =Operator diese beiden Bedeutungen hat, gibt es keine Möglichkeit, diese Syntax darzustellen. Das Beste, was Sie tun können, ist, eine Funktion zu erstellen, die eine Reihe von Parametern byrefsowie einen Wert übernimmt und diesem Wert alle Parameter zuweist.
Servy


5
int num1, num2, num3;

num1 = num2 = num3 = 5;

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


5

Ihr Beispiel wäre:

int num1 = 1;
int num2 = 1;

num1 = num2 = 5;


0

Dies ist jetzt eine Sache in C #:

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

Auf diese Weise haben Sie grundsätzlich drei Variablen deklariert. a = 1, b = 2Und c = 3. Alles in einer einzigen Zeile.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.