2013-01-10 13 views

Odpowiedz

8

Nie. Możliwe są tylko stałe czasowe kompilacji. można przypisać w null, a następnie

void SomeMethod(IEnumerable<int> list = null) 
{ 
    if(list == null) 
     list = new List<int>{1,2,3}; 
} 

Następny fragment kodu jest wziąć ze znanego C# in Depth książki Jon Skeet. Strona 371. Proponuje użyć wartości null jako rodzaju wskaźnika not set dla parametrów, które mogą mieć znaczące wartości domyślne.

static void AppendTimestamp(string filename, 
          string message, 
          Encoding encoding = null, 
          DateTime? timestamp = null) 
{ 
    Encoding realEncoding = encoding ?? Encoding.UTF8; 
    DateTime realTimestamp = timestamp ?? DateTime.Now; 
    using (TextWriter writer = new StreamWriter(filename, true, realEncoding)) 
    { 
     writer.WriteLine("{0:s}: {1}", realTimestamp, message); 
    } 
} 

Wykorzystanie

AppendTimestamp("utf8.txt", "First message"); 
AppendTimestamp("ascii.txt", "ASCII", Encoding.ASCII); 
AppendTimestamp("utf8.txt", "Message in the future", null, new DateTime(2030, 1, 1)); 
+0

Naprawdę niesamowitym efektem ubocznym tego wzorca jest to, że nie napotykasz problemu związanego z domyślnymi parametrami wywołania strony wywołania, jeśli wystawiasz je przez niektóre biblioteki klas, ponieważ pozwala to na modyfikację wartości domyślnych i włączenie ich w momencie aktualizacji biblioteki. W ten sposób unikając tego problemu: http://stackoverflow.com/a/664691/84206 – AaronLS

4

Nie - parametry domyślne muszą być stałymi w czasie kompilacji.

Najlepiej jest przeciążać metodę. Możesz również ustawić wartość domyślną na null, a wewnątrz metody wykryć wartość pustą i zamienić ją na wybraną listę.

4

Jak o zrobienie jego domyślną wartość jako null, oraz w sposobie

numbers = numbers ?? Enumerable.Empty<int>(); 

lub

numbers = numbers ?? new []{ 1, 2, 3}.AsEnumerable(); 
3

Nie, trzeba czasu kompilacji stały.

Ale można użyć przeciążenie jak obejść:

public void Foo(int arg1) 
{ 
     Foo(arg1, new[] { 1, 2, 3 }); 
} 

public void Foo(int arg1, IEnumerable<int> arg2) 
{ 
     // do something 
} 
+0

Myślę, że chcesz wywołać pierwszą metodę z drugiej, ale +1 –

+0

@lazyberezovsky: już edytowane, dziękuję. –

3

Dobrze ponieważ trzeba kompilować stałe czasowe trzeba by ustawić go null

ale wtedy można wykonać następujące czynności w metodzie

Powiązane problemy