2011-08-11 15 views
5

W .NET Framework I stale zobaczyć przeciążone funkcje jak poniżej,C# params słowo kluczowe i funkcja przeciążenia

  1. public void Log(string message) ...
  2. public void Log(string message, params object[] args) ...

moje pytanie jest od params słowo kluczowe pozwala na zero lub więcej parametrów, czy możemy po prostu pozbyć się pierwszego podpisu? Mając tylko drugi podpis, mógłbym go nazwać bez parametrów dobrze jak poniżej, więc nie wiem, dlaczego mieliby mieć pierwszy podpis?

Log("calling with no param"); 

Odpowiedz

6

Kolejny powód to params jest powolny, myśląc, że wszystkie parametry są zbierane, a tablica jest budowana. Drugi jest wolniejszy.

public static string Format(string format, object arg0); 
public static string Format(string format, params object[] args); 
+1

Jeffrey Richter w jego książce [CLR przez C#] (http://oreilly.com/catalog/9780735627048) idzie o to bardziej szczegółowo; w zasadzie masz rację, jest to optymalizacja, aby uniknąć niepotrzebnych kosztów ogólnych tablic (budowa, dostęp i usuwanie śmieci). – Bevan

+2

@Bevan: Ja też to wiem ze swojej książki :) –

+0

Zauważ, że jeśli nazwiesz 'Format (" foo ", null)' zostanie wywołana druga wersja funkcji, z 'args == null'. –

2

Ten wzór jest zwykle używany, jeśli wersja bezszeryfowa ma prostszą implementację.

2

Istnieje również niewielka przewaga prędkości.

milisekund pobrano przy 1 miliard iteracji wywoływania bardzo prosty (count++) sposobu ze sobą:

  • 2472 ms W/O params
  • 7773 ms W/params