Sınırsız miktarda parametre alan yöntemler neden daha az parametreye sahip aşırı yükleri tanımlar?


36

Örneğin, .NET'teki System.IO.Path.Combineyöntem aşağıdaki aşırı yüklemelere sahiptir:

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

Son üçün amacı ne?

İlki hepsini kapsayacak, yakından bakarsanız, paramsanahtar kelimeyi kullanır . Geriye dönük uyumluluk argümanı yalnızca Combine(String, String)varyantı kapsayacaktır , çünkü .NET 4'e kadar olan tek sürümdü.

Yanıtlar:


56

Ana sebep performans içindir. "Sınırsız argümanlar" sözdizimsel şeker aslında bir dizi dizidir. Yalnızca bir dize geçiriyorsanız, neden yalnızca bir dize içeren bir dizi oluşturun? Özellikle, bu yöntemin başlatılmalarının ~% 90'ı 3 veya daha az argümanla yapılacaksa, daha ağır ağırlık dizisi nesnesine ihtiyaç yoktur. Bellekte biraz daha hafiftir ve biraz daha az işlem süresi alır, çünkü yöntemi tanımlamak için bir döngüye ihtiyaç duymazsınız. Üç dizeniz varsa, üç dizgiyi kodlamanız yeterlidir.


Unutulmaması gereken bir başka şey Combine, sıfır veya bir yol bölümüyle geçmenin bile bir anlam ifade etmemesidir, ancak paramssürüm bunu yapmanıza izin verir.
Matthew,

4
Farklı sayıdaki argümanları kabul eden aşırı yük sayısının nedeni okunabilirlik değildir. Bir dizi dizi üreterek ve ardından onları işleyerek oluşan ek yük nedeniyle performans içindir. Kabul etmenin nedeni params string[]okunabilirlik içindir.
Greg Burghardt

2
Performans aslında nedendir ve özel olarak bir fonksiyonun iç döngülerden çağrılmasının beklendiği zamanlar olduğuna inanıyorum . Brad Abrams'ın C # Programlama Dilinin s.27'deki notuna göre , Üçüncü Baskı şöyle diyor: “[T] o C # modeli her çağrıda dolaylı olarak ek bir nesne tahsisi (içeren dizi) yaratıyor. Bu nadiren bir sorun, ancak iç verimsiz olabileceği ilmek tipi senaryolar, ana akım durumlar için paramsaşırı yüklenmeyi ve sadece aşırı durumlar için aşırı yüklenmeyi öneriyoruz . Bir örnek StringBuilder.AppendFormat()aşırı yük ailesidir. "
Eliah Kagan

3
@ LowFlyingPelican Mono ve .NET Framework aynı değildir. .NET Framework sürümüne bakarsanız, aslında oldukça farklı bir çözüm.
Alex

3
@LowFlyingPelican: .NET çerçevenin nedeni olan performans. Mono'nun bu yöntemi uygulama nedeni, .NET ile API uyumluluğuydı. Mono'nun bu yöntemi bu şekilde uygulamasının nedeni, uygulama basitliğidir (Microsoft'tan çok daha az kaynağa sahip olduklarından dolayı).
jhominal

4

Sözdizimsel şeker.

Dosya yollarını değiştirirken, az sayıda sabit değere sahip olmak oldukça yaygındır. Bu durumlarda, onları bir diziye paketlemek yerine doğrudan kullanmak daha uygundur.


3
Paramlarla, onu çoktan çekiyorsun. msdn.microsoft.com/en-us/library/w5zay9db.aspx Diziye gerek yok.
Thomas Junk,

3
C # 'da, bir puanınız var, @Thomas. Ancak, .NET, diğer dilleri de desteklemiyor params.
Karl Bielefeldt

@ThomasJunk Bu bağlantı benim için öldü, ne yazık ki, ama C # vasat olduğu için haklı olduğunuza eminim. Daha temiz kodlara izin vermek için bunu yapan birçok dili olan kütüphaneleri gördüm.
Robotu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.