2012-09-25 2 views
6

Mam jedną funkcję mającą dwa stałe argumenty. Ale kolejne argumenty nie są ustalone, mogą być dwa lub trzy lub cztery.Jak przekazywać opcjonalne argumenty

To są argumenty runtime, więc jak mogę zdefiniować tę funkcję?

Mój kod wygląda następująco:

public ObservableCollection<ERCErrors> ErrorCollectionWithValue 
    (string ErrorDode, int MulCopyNo, dynamic arguments comming it should be 2 or 3) 
     { 

     return null; 
    } 
+0

Mayby jest to coś dla Ciebie ?: http://csharp.net-tutorials.com/classes/method-overloading/ – Mathlight

Odpowiedz

12

1) params (C# Reference)

public ObservableCollection<ERCErrors>ErrorCollectionWithValue 
       (string ErrorDode, int MulCopyNo, params object[] args) 
{ 
    //... 
} 

2) Named and Optional Arguments (C# Programming Guide)

public ObservableCollection<ERCErrors> ErrorCollectionWithValue 
    (string ErrorDode, int MulCopyNo, object arg1 = null, int arg2 = int.MinValue) 
{ 
    //... 
} 

3) A może prosty sposób overloading będzie nadal odpowiadał lepiej, oddzielenie logiki metody do różnych metod? Pod tym linkiem można również znaleźć inny opis nazwanych i opcjonalne parametry

5

Jednym ze sposobów jest już przeciążony metod

public ObservableCollection<ERCErrors> ErrorCollectionWithValue 
    (string ErrorDode, int MulCopyNo, int param1) 
{ 
    //do some thing with param1 
} 

public ObservableCollection<ERCErrors> ErrorCollectionWithValue 
    (string ErrorDode, int MulCopyNo, int param1,int param2) 
{ 
    //do some thing with param1 and param3 
} 

public ObservableCollection<ERCErrors> ErrorCollectionWithValue 
    (string ErrorDode, int MulCopyNo, int param1, int param2, int param3) 
    { 
       //do some thing with param1, param2 and param3 
    } 

wtedy wszystkie te ważne

var err = ErrorCollectionWithValue("text", 10, 1); 
var err = ErrorCollectionWithValue("text", 10, 1,2); 
var err = ErrorCollectionWithValue("text", 10, 1,2,3); 

Innym podejściem jest użycie opcjonalnych parametrów . W tym celu potrzebna jest tylko jedna metoda, a nie 3 w pierwszym podejściu.

public ObservableCollection<ERCErrors> ErrorCollectionWithValue 
    (string ErrorDode, int MulCopyNo, int param1 = 0, int param2 = 0, optional int param3 = 0) 
{ 

} 

są nadal ważne

var err = ErrorCollectionWithValue("text", 10, 1); //defaults param2 and param3 to 0 
var err = ErrorCollectionWithValue("text", 10, 1,2); //defaults param3 to 0 
var err = ErrorCollectionWithValue("text", 10, 1,2,3); 

Aby pominąć żadnej z opcjonalnych parametrów, trzeba użyć named parameters i this który jest obsługiwany tylko w C# 4.0 i powyżej

var err = ErrorCollectionWithValue("text", param3: 5); //skipping param1 and param2 

W w pozostałych dwóch podejściach nie można pominąć kolejności parametrów.

2

Można iść z params, jeśli liczba argumentów może być różna:

public ObservableCollection<ERCErrors> ErrorCollectionWithValue(string errorCode, int num, params object[] args) 
{ 
    foreach(object obj in args) 
{ 
    //process args. 
} 
} 
+0

Dzięki temu właśnie tego chcę. –