2010-08-13 15 views
60

Biri, varsayılan olarak boş bir diziyle isteğe bağlı bir diziyi alan bir işlevi nasıl tanımlar? içindeİsteğe bağlı bir parametrenin varsayılan değeri olarak boş bir diziyi geçirme

public void DoSomething(int index, ushort[] array = new ushort[] {}, 
bool thirdParam = true) 

sonuçları: 'dizi' için

Standart parametre değeri bir derleme sabit olmalıdır.

+1

Bu bir kopya değil. Bir dizi için değil, bir dize için varsayılan değer nasıl ayarlanacağını sorma özeldir. – Darren

cevap

91

Nesne başvurularının derleme zamanı sabitlerini oluşturamazsınız.

public void DoSomething(int index, ushort[] array = null, 
    bool thirdParam = true) 

Ve bu do senin yöntemi içinde:

array = array ?? new ushort[0]; 
+3

numaralı yaklaşımlarda gerçek bir fark vardır, evet, boş geçme dışında boş bir dizi ile aynı olmadıkça akla gelir. Yöntemin içinde param olmak zorunda kalmadan bunu yapmanın bir yolunu umuyordum. Nesne referanslarının ompil zamanlı sabitleri hakkında bit anlamlı olur. Teşekkürler! ArgumentNullException'ı atan – MandoMando

+0

, herkes nedenini biliyor mu? – Ayyash

+2

Evet, aslında 'null' aldığınız olayı düzeltmiyorsunuz, ikinci ifadeyi cevabımdan kullandınız mı? –

15

Eğer yapabiliyorsanız

kullanabileceğiniz sabit tek geçerli derleme zamanı yani bu şekilde kodunu değiştirmek, null olduğunu Bunu yapabildiğiniz son bağımsız değişkeni sıralayın:

public void DoSomething(int index, bool wasThirdParam = true, params ushort[] array) 

Derleyici belirtilmemişse, boş bir diziyi otomatik olarak geçirir ve bir diziyi tek bir argüman olarak iletmek veya öğeleri doğrudan değişken uzunluk argümanları olarak yönteminize eklemek için ek esneklik elde edersiniz.

3

Ben eski bir soru olduğunu biliyorum ve bu cevabı doğrudan derleyici tarafından dayatılan sınırlamalar etrafında nasıl çözmez iken, yöntem aşırı yükleme bir alternatiftir:

public void DoSomething(int index, bool thirdParam = true){ 
     DoSomething(index, new ushort[] {}, thirdParam); 
    } 

    public void DoSomething(int index, ushort[] array, bool thirdParam = true){ 

     ... 
    } 
+0

Bir derleyicinin, normal bir zaman yerine karşılıklı bir özyineleme yapıp yapamayacağından emin değilim * (evet, biliyorum, örneğin g ++ 'da -foptimize-kardeş-çağrı seçeneği var, ama C++, C# derleyiciler yapıp yapamayacağından emin değilsiniz *. –

İlgili konular