2012-09-26 14 views
9

w C# można użyć domyślnych wartości parametrów w metodzie, w przykładzie:Metoda Domyślna wartość array parametr

public void SomeMethod(String someString = "string value") 
{ 
    Debug.WriteLine(someString); 
} 

Ale teraz chcę używać tablicy jako parametr w metodzie, i ustawić domyślna wartość dla niego.
Myślałam powinno to wyglądać mniej więcej tak:

public void SomeMethod(String[] arrayString = {"value 1", "value 2", "value 3"}) 
{ 
    foreach(someString in arrayString) 
    { 
     Debug.WriteLine(someString); 
    } 
} 

Ale to nie działa.
Czy jest to właściwy sposób, jeśli jest to w ogóle możliwe?

+0

Zdefiniuj "nie działa". – Tudor

+0

Istnieje obejście dla typów referencji. Ustaw domyślny argument na "null". Następnie wewnątrz bloku kodu sprawdź, czy parametr ma wartość null, jeśli jest pusty, ustaw wartość domyślną dla parametru typu odniesienia. –

Odpowiedz

15

Czy jest to właściwy sposób, jeśli jest to w ogóle możliwe?

nie jest możliwe (bezpośrednio) jako wartości domyślne może być jeden z następujących (z Optional Arguments)

  • stałej ekspresji;
  • wyrażenie nowej formy ValType(), gdzie ValType jest typem wartości, takim jak wyliczenie lub struct;
  • Wyrażenie domyślnej formy (ValType), gdzie ValType jest typem wartości.

Utworzenie tablicy nie pasuje do żadnej z możliwych wartości domyślnych dla opcjonalnych argumentów.

Najlepszym rozwiązaniem jest, aby dokonać przeciążeniem:

public void SomeMethod() 
{ 
    SomeMethod(new[] {"value 1", "value 2", "value 3"}); 
} 


public void SomeMethod(String[] arrayString) 
{ 
    foreach(someString in arrayString) 
    { 
     Debug.WriteLine(someString); 
    } 
} 
+0

Ok, dzięki. Pójdę na to. Przyjmuję to jako moją odpowiedź za około 11 minut. –

10

Spróbuj tego:

public void SomeMethod(String[] arrayString = null) 
{ 
    arrayString = arrayString ?? {"value 1", "value 2", "value 3"}; 
    foreach(someString in arrayString) 
    { 
     Debug.WriteLine(someString); 
    } 
} 
someMethod(); 
+0

Dzięki za twój wkład. Wydaje się, że jest to dobry sposób, jednak zamierzam trzymać się odpowiedzi Reeda na ten temat, ponieważ przydaje się to również w inny sposób. –

+3

+1 Jest to zręczne podejście, ale nie daje sposobu na odróżnienie użytkownika przechodzącego w null * jawnie * i po prostu nieużywanie parametru (dlatego zazwyczaj preferuję podejście przeciążeniowe). To może lub nie może być ważne w tym przypadku. –

+0

Nie ma za co. – Nathan