2010-06-29 24 views
6

dizisi olarak yöntem parametresi varsayılan değerleri C# 4.0 yöntemi varsayılan değerler parametrelerinde dizi olarak kullanılabilir (örneğin, string [] sArray için)? evet ise nasıl uygulanır? C# 4.0:

Ben çağrı işlevi aşağıda gibi çalıştı:

MethodA(string[] legends=new string[]{"a","b"},float[] values=new float[]{1,2}, string alt="sd"); 

derleme zamanı sabiti, diziler kullanılamaz anlamına gelir olmalıdır

cevap

10

Diğerlerinin de söylediği gibi, varsayılan değerler diziler olamaz.

public void Foo(int[] x = null) 
{ 
    x = x ?? new int[] { 5, 10 }; 
} 

Yoksa dizi mutasyona veya arayana maruz gitmiyorsun eğer:

Ancak bu kaçınmanın bir yolu varsayılan değer null yapmak ve sonra gerekirse diziyi başlatmak için olduğunu
private static readonly int[] FooDefault = new int[] { 5, 10 }; 
public void Foo(int[] x = null) 
{ 
    x = x ?? FooDefault; 
} 

Bu, null'un başka bir nedenden dolayı kullanmak istediğiniz bir değer olmadığını varsayar. Genel olarak geçerli bir fikir değildir, ancak varsayılan değeri derleme zamanı sabiti olarak ifade edemediğiniz bazı durumlarda iyi çalışır. Aynı şeyi Encoding.UTF8 gibi bir şey için varsayılan kodlama olarak kullanabilirsiniz.

Eğer bir değer türü parametresi istiyorsanız, bunu null olarak yapabilirsiniz. Örneğin, yapabileceğin (açıkça bir derleme zamanı sabiti değil) işlemci sayısına bir parametre varsayılan istedi varsayalım:

public void RunInParallel(int? cores = null) 
{ 
    int realCores = cores ?? Environment.ProcessorCount; 
} 
3

varsayılan değerler iş değil.

  • sabit-ifadeyi
  • bir ifadesidir:

    varsayılan-argüman ifade aşağıdakilerden biri olmalıdır:

    standart (pg 312) bu diyor yeni S() burada S, bir değer

  • bir değer ifadesidir. Burada S değeri bir değer
+0

Ah vay bu çok korkunç. Özniteliklerle aynı sorun olması haricinde, aslında onlar için dizileri kullanabileceğine eminim. Neden başlangıçlandırılmış bir dizi bildiremezsiniz? Onlar sabit –

+1

@ Graphain: Hangi bir boş bir sabit dışında herhangi bir dizi nedir? Boş olmayan diziler her zaman değiştirilebilir. Derleyici, bir şey (örneğin çağrılan yöntem) içeriği değiştirdiğinde, her çağrıda dizinin bir kopyasını oluşturmak zorunda kalacaktır. –

+0

@Jon Skeet - Peki, varsayılanların sabit olması gerekiyorsa, derleyicinin bir diziyi salt okunur olarak değerlendirmek için yeterince akıllı olacağını varsayalım. Değişen tek yol, eğer birisi doğru yansıma ile tinker yaparsa, ki bu da gerçek sabitler için aynı sorun olacaktır (örneğin dize vb.). –