C #: Tek bir deyimde birden çok değişkene aynı değeri atayın


161

Tek bir ifadede aynı anda birden çok değişkene bir değer atamak için herhangi bir yolu var mı (bugün sadece birden çok değişkene birden çok aynı değer ataması ile karşılaştım çünkü meraktan)?

Bu çizgiler boyunca bir şey (sözde kod):

int num1 = 1;
int num2 = 1;

num1 & num2 = 5;

Muhtemelen hayır ama ben benzer bir şey aslında mümkün olması durumunda sormaya değer olduğunu düşündüm!

Yanıtlar:


259

Bu kadar basit:

num1 = num2 = 5;

Değişken yerine bir nesne özelliği kullanılırken get, ara değerin erişimcisinin çağrılmadığını bilmek ilginçtir . setAtama sırasında erişilen tüm özellikler için yalnızca erişimci çağrılır.

Örneğin, getve seterişimci her çağrıldığında konsola yazan bir sınıfı ele alalım .

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

Bu çıktı

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

Bu, derleyicinin tüm özelliklere değer atayacağı ve her atandığında değeri yeniden okumayacağı anlamına gelir.


36
Aslında garip değil. Mantık aşağıdaki gibidir: Atama işleminin kendisi atanmış olan bir değer döndürür. Yürütme sırası: num1 = (num2 = 5)ve yürütülen ilk atama ( num2 = 5) dış dünyaya 5 değerini döndürür - bu da num1'e atanır. Bu reklam infinitum ( num0 = num1 = num2 = 5) çalışır .
Jpsy

Test etmek istiyorsanız deneyin Console.WriteLine(num = 5);. (Feragatname: Henüz yapmadım)
Arlen Beiler

3
Soru: Bu kötü bir uygulama num1 = num2 = 5mıdır? Daha fazla değişken söz konusuysa kodu okunamıyor mu? Kaçırdığım için üzgünüm, sadece bunun için yeni bir yazı oluşturmak istemedim.
johnildergleidisson

Doğru cevap yok. Programımda çok az kullanıyorum ve bundan kaçınabilirdim.
Pierre-Alain Vigeant

Sonra kodlama tarzı aşağı sanırım. Cevap için teşekkürler.
johnildergleidisson

54

Bu istediğinizi isteyecektir:

int num1, num2;
num1 = num2 = 5;

'num2 = 5' ataması atanan değeri döndürür.

Bu, num1 = (num2 = 5) +3;çok okunabilir olmadığı için tavsiye etmememe rağmen, num1'e 8 atayacak gibi çılgın şeyler yapmanıza izin verir .


Artık çalışmıyor.
Aurelien B

33
int num1=5,num2=5

Değişkenleri aynı ifadede bildirme ve atama.


Bu tek bir ifade mi yoksa iki ifade mi?
Merin Nakarmi

harika cevap, ama "5" uzun bir dize sabiti olduğunda garip görünüyor. string a = "really long string", b = "really long string";
Alex

13

Sözdiziminde biraz daha kısa ama başkalarının söylediklerini alarak.

int num1, num2 = num1 = 1;

Bunun en iyi cevap olduğunu düşünüyorum çünkü hem başlatma hem de atama tek bir ifadede yapılabilir.
Sachin Parashar

11

Bunu dene:

num1 = num2 = 5;

Bunun VB'de çalışmadığını unutmayın.


1
VB geliştiricileri için bazı alternatif sözdizimi olup olmadığını veya VB'de birden fazla atama olup olmadığını biliyor musunuz?
ckittel

3
@cki: AFAIK, desteklenmiyor.
SLaks

@ckittel VB =hem atama hem de eşitlik için kullanılır, bu nedenle num1 = num2 = 5"beşe num2değişkene eşit olup olmadığı boole sonucunu ata " anlamına gelir num1. =Operatör bu iki anlama sahip olduğundan, bu sözdizimini temsil etmenin bir yolu yoktur. Yapabileceğiniz en iyi şey, byrefbir değerin yanı sıra bir dizi parametreyi alan ve tüm parametreleri bu değere atayan bir işlev oluşturmaktır .
Servy


5
int num1, num2, num3;

num1 = num2 = num3 = 5;

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




0

Bu şimdi C # bir şey:

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

Yukarıdakileri yaparak, temel olarak üç değişken beyan ettiniz. a = 1, b = 2ve c = 3. Hepsi tek bir satırda.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.