2009-09-14 16 views
110

Czy jest jakiś sposób (tylko z ciekawości, ponieważ napotkałem wiele przypisań tej samej wartości do wielu zmiennych dzisiaj) w C#, aby przypisać jedną wartość do wielu zmiennych na raz w pojedyncze stwierdzenia?C#: Przypisanie tej samej wartości wielu zmiennym w pojedynczej instrukcji

Coś wzdłuż tych linii (pseudokod):

int num1 = 1; 
int num2 = 1; 

num1 & num2 = 5; 
nie

Prawdopodobnie ale myślałem, że to warto zapytać w razie coś podobnego jest faktycznie możliwe!

Odpowiedz

189

Jest to tak proste, jak:

num1 = num2 = 5; 

Podczas korzystania z właściwości obiektu zamiast zmiennej, warto wiedzieć, że get accessor wartości pośredniej nie jest tzw. Tylko accessor set jest wywoływany dla wszystkich właściwości uzyskanych w sekwencji przydziału.

Weźmy na przykład klasę, która zapisuje na konsoli za każdym razem, gdy wywoływany jest akcesor get i 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; 
     } 
    } 
} 

Będzie to wyjście

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

oznacza, że ​​kompilator przydzieli wartość do wszystkich właściwości i nie będzie ponownie odczytać wartość za każdym razem jest on przypisany.

+1

Wygląda dziwnie, ale działa!Dzięki;) – Alex

+1

Po prostu przeczytaj to tak, jak się wydaje: num1 jest równe num2 co równa się 5 –

+25

To wcale nie jest dziwne. Logika jest następująca: Operacja przypisania sama zwraca wartość, która jest wartością, która została przypisana. Sekwencja wykonania jest następująca: '' num1 = (num2 = 5) '' i pierwsze wykonane zadanie ('' num2 = 5'') zwraca wartość 5 do świata zewnętrznego, który z kolei jest przypisany do num1. Działa to ad infinitum ('' num0 = num1 = num2 = 5''). – Jpsy

5
int num1, num2, num3; 

num1 = num2 = num3 = 5; 

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

Coś takiego.

num1 = num2 = 5 
11

Spróbuj tego:

num1 = num2 = 5; 

Należy pamiętać, że to nie będzie działać w VB.

+1

Czy wiesz, czy istnieje alternatywna składnia dla programistów VB, lub jest wiele zadań po prostu niedostępnych w VB? – ckittel

+3

@cki: AFAIK, nie jest obsługiwany. – SLaks

+0

@ckittel W VB '=' jest używane zarówno do przypisania, jak i równości, więc 'num1 = num2 = 5' oznaczałoby" przypisać wynik boolowski, czy pięć jest równe 'num2' do zmiennej' num1'. Ponieważ operator '=' ma te dwa znaczenia, nie ma możliwości przedstawienia tej składni. Najlepsze, co możesz zrobić, to stworzyć funkcję, która przyjmuje szereg parametrów 'byref', a także wartość i przypisuje wszystkie parametry do tej wartości. – Servy

4

Twój przykład byłoby:

int num1 = 1; 
int num2 = 1; 

num1 = num2 = 5; 
40

Będzie chcę chcesz:

int num1, num2; 
num1 = num2 = 5; 

'num2 = 5' przypisanie powróci przypisaną wartość.

Umożliwia to wykonywanie szalonych rzeczy, takich jak num1 = (num2 = 5) +3;, które przypiszą 8 do num1, chociaż nie zaleciłbym, aby było to bardzo czytelne.

24
int num1=5,num2=5 

Deklarowanie i przypisywanie zmiennych w tej samej instrukcji.

+0

To jest mój preferowany sposób. Moim zdaniem jest to najbardziej czytelne. –

+0

Czy jest to pojedyncza instrukcja lub dwie instrukcje? –

3

Coś trochę krótszego w składni, ale biorąc to, co inni już napisali.

int num1, num2 = num1 = 1; 
0

To jest proste.

int num1,num2; 
num1 = num2 = 5; 
Powiązane problemy