C #: Przypisz tę samą wartość do wielu zmiennych w jednej instrukcji


161

Czy istnieje sposób (tak z ciekawości, ponieważ natknąłem się dziś na wiele przypisań tej samej wartości do wielu zmiennych) w C #, aby przypisać jedną wartość do wielu zmiennych naraz w jednym oświadczeniu?

Coś w tym stylu (pseudokod):

int num1 = 1;
int num2 = 1;

num1 & num2 = 5;

Chyba nie, ale pomyślałem, że warto zapytać, czy coś podobnego jest rzeczywiście możliwe!

Odpowiedzi:


259

To tak proste, jak:

num1 = num2 = 5;

Używając właściwości obiektu zamiast zmiennej, warto wiedzieć, że getmetoda dostępu wartości pośredniej nie jest wywoływana. Tylko setmetoda dostępu jest wywoływana dla wszystkich właściwości, do których uzyskano dostęp w sekwencji przypisania.

Weźmy na przykład klasę, która zapisuje w konsoli za każdym razem, gdy wywoływane są metody dostępu geti set.

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

To wyjdzie

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

Oznacza to, że kompilator przypisze wartość do wszystkich właściwości i nie będzie ponownie odczytywał wartości za każdym razem, gdy zostanie przypisana.


36
Właściwie to nie jest dziwne. Logika jest następująca: sama operacja przypisania zwraca wartość, która jest wartością, która została przypisana. Sekwencja wykonania to: num1 = (num2 = 5)a pierwsze przypisanie, które jest wykonywane ( num2 = 5), zwraca wartość 5 światu zewnętrznemu - który z kolei jest przypisywany do num1. Działa to ad infinitum ( num0 = num1 = num2 = 5).
Jpsy

Jeśli chcesz to przetestować, spróbuj Console.WriteLine(num = 5);. (Zastrzeżenie: jeszcze tego nie zrobiłem)
Arlen Beiler

3
Pytanie: Czy jest to uważane za złą praktykę num1 = num2 = 5? Czy kod staje się nieczytelny, jeśli zaangażowanych jest więcej zmiennych? Przepraszam, że porywam, nie chciałem tworzyć nowego posta tylko dla tego.
johnildergleidisson

Nie ma poprawnej odpowiedzi. Rzadko go używam w moim programie i mogłem tego uniknąć.
Pierre-Alain Vigeant

W takim razie zakładam styl kodowania. Dziękuję za odpowiedź.
johnildergleidisson

54

To będzie chciało:

int num1, num2;
num1 = num2 = 5;

Przypisanie „num2 = 5” zwróci przypisaną wartość.

Pozwala to na robienie szalonych rzeczy, takich jak num1 = (num2 = 5) +3;przypisanie 8 do num1, chociaż nie polecałbym tego robić, ponieważ nie jest zbyt czytelny.


To już nie działa.
Aurelien B

33
int num1=5,num2=5

Deklarowanie i przypisywanie zmiennych w tej samej instrukcji.


Czy to jedno stwierdzenie czy dwa stwierdzenia?
Merin Nakarmi

świetna odpowiedź, ale wygląda dziwnie, gdy „5” to stała długa. string a = "really long string", b = "really long string";
Alex

13

Coś nieco krótszego w składni, ale biorąc pod uwagę to, co powiedzieli już inni.

int num1, num2 = num1 = 1;

Myślę, że to najlepsza odpowiedź, ponieważ zarówno inicjalizację, jak i przypisanie można wykonać w jednej instrukcji.
Sachin Parashar

11

Spróbuj tego:

num1 = num2 = 5;

Zauważ, że to nie zadziała w VB.


1
Czy wiesz, czy istnieje alternatywna składnia dla programistów VB, czy też wielokrotne przypisanie jest po prostu niedostępne w VB?
ckittel

3
@cki: AFAIK, to nie jest obsługiwane.
SLaks

@ckittel W VB =jest używane zarówno do przypisania, jak i równości, więc num1 = num2 = 5oznaczałoby „przypisz wynik boolowski określający, czy pięć jest równe num2zmiennej num1”. Ponieważ =operator ma te dwa znaczenia, nie ma sposobu, aby przedstawić tę składnię. Najlepsze, co możesz zrobić, to utworzyć funkcję pobierającą szereg parametrów byreforaz wartość i przypisującą wszystkie parametry do tej wartości.
Servy


5
int num1, num2, num3;

num1 = num2 = num3 = 5;

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


5

Twój przykład to:

int num1 = 1;
int num2 = 1;

num1 = num2 = 5;


0

To jest teraz rzecz w C #:

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

Wykonując powyższe czynności, w zasadzie zadeklarowałeś trzy zmienne. a = 1, b = 2i c = 3. Wszystko w jednej linii.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.