Perché i metodi che accettano una quantità illimitata di parametri spesso definiscono sovraccarichi con meno parametri?


36

Ad esempio, il System.IO.Path.Combinemetodo in .NET presenta i seguenti sovraccarichi:

Combine(params String[])
Combine(String, String)
Combine(String, String, String)
Combine(String, String, String, String)

Qual è il punto degli ultimi tre?

Il primo li coprirebbe tutti, come se guardassi da vicino, usa la paramsparola chiave. L'argomento della compatibilità con le versioni precedenti riguarderebbe solo la Combine(String, String)variante, poiché era l'unica versione fino a .NET 4.

Risposte:


56

Il motivo principale è per le prestazioni. Lo zucchero sintattico "argomenti illimitati" è in realtà una serie di stringhe. Se si passa solo una stringa, perché creare un array con una sola stringa? Soprattutto se ~ 90% delle invocazioni di questo metodo saranno con 3 o meno argomenti, non è necessario l'oggetto array di pesi più pesante. È un po 'più leggero in memoria e richiede un po' meno tempo di elaborazione perché non è necessario un loop per definire il metodo. Se hai tre stringhe, devi solo codificare tre stringhe.


Un'altra cosa da notare è che passare Combinecon zero o segmenti di un percorso non ha nemmeno senso, ma la paramsversione ti consente di farlo.
Matteo,

4
Il motivo del numero di sovraccarichi che accettano diversi numeri di argomenti non è per la leggibilità. È per le prestazioni a causa del sovraccarico dovuto alla generazione di una matrice di stringhe e quindi alla loro elaborazione. Il motivo dell'accettazione params string[]è per la leggibilità.
Greg Burghardt,

2
Le prestazioni sono davvero il motivo, e credo che sia specifico per quando si prevede che una funzione venga chiamata dagli anelli interni . Come l'annotazione di Brad Abrams a p.27 di The C # Programming Language, Third Edition dice: "[T] il modello C # crea un'allocazione di oggetti extra (l'array contenente) implicitamente su ogni chiamata. Questo è raramente un problema, ma in -loop scenari di tipo in cui potrebbe diventare inefficiente, suggeriamo di fornire sovraccarichi per i casi principali e di utilizzare il paramssovraccarico solo per i casi limite. Un esempio è la StringBuilder.AppendFormat()famiglia di sovraccarichi. "
Eliah Kagan,

3
@LowFlyingPelican Mono e .NET Framework non sono gli stessi. Se guardi la versione di .NET Framework , in realtà è una soluzione abbastanza diversa.
Alex,

3
@LowFlyingPelican: la ragione del framework .NET è la prestazione. La ragione di Mono per implementare quel metodo era la compatibilità API con .NET. La ragione di Mono per implementare quel metodo in quel modo era la semplicità di implementazione (a causa del fatto che disponevano di risorse considerevolmente meno di Microsoft).
jhominal

4

Zucchero sintattico

Quando si manipolano i percorsi dei file, è estremamente comune avere un numero limitato di valori fissi. In questi casi, è più conveniente usarli direttamente anziché impacchettarli in un array.


3
Con i parametri, lo stai già suggerendo. msdn.microsoft.com/en-us/library/w5zay9db.aspx Non è necessario un array.
Thomas Junk,

3
In C #, hai un punto, @Thomas. Tuttavia, .NET supporta anche altre lingue senza params.
Karl Bielefeldt,

@ThomasJunk Quel link è morto per me, sfortunatamente, ma sono sicuro che hai ragione perché il mio C # è mediocre. Ho appena visto molte librerie con molte lingue che lo fanno solo per consentire un codice più pulito.
Gort the Robot
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.