Mengapa metode yang menggunakan jumlah tak terbatas parameter sering mendefinisikan kelebihan beban dengan parameter lebih sedikit?

36

Misalnya, System.IO.Path.Combinemetode di .NET memiliki kelebihan berikut:

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

Apa gunanya dari tiga terakhir?

Yang pertama akan mencakup semuanya, seolah-olah Anda melihat dari dekat, itu menggunakan paramskata kunci. Argumen kompatibilitas mundur hanya akan mencakupCombine(String, String) varian, karena itu adalah satu-satunya versi hingga .NET 4.

Alex
sumber

Jawaban:

56

Alasan utamanya adalah kinerja. Gula sintaksis "argumen tak terbatas" sebenarnya adalah serangkaian String. Jika Anda hanya melewati satu string, mengapa membuat array dengan hanya satu string? Terutama jika ~ 90% dari doa metode ini akan dengan 3 atau lebih sedikit argumen, tidak perlu untuk objek array yang lebih berat. Memori ini sedikit lebih ringan dan membutuhkan waktu pemrosesan yang lebih sedikit karena Anda tidak memerlukan perulangan untuk mendefinisikan metode ini. Jika Anda memiliki tiga string, Anda cukup kode untuk tiga string.

Greg Burghardt
sumber
Hal lain yang perlu diperhatikan adalah bahwa lewat Combinedengan nol atau satu segmen jalan bahkan tidak masuk akal, namun paramsversi ini memungkinkan Anda untuk melakukan ini.
Matius
4
Alasan untuk jumlah kelebihan menerima jumlah argumen yang berbeda bukan untuk keterbacaan. Ini untuk kinerja karena overhead yang dikeluarkan dengan menghasilkan serangkaian string, dan kemudian memprosesnya. Alasan untuk menerima params string[]adalah untuk keterbacaan.
Greg Burghardt
2
Kinerja memang alasannya, dan saya percaya itu khusus untuk saat suatu fungsi diharapkan dipanggil dari loop dalam . Seperti penjelasan Brad Abrams pada hal.27 dari The C # Programming Language, Edisi Ketiga mengatakan: "[T] he C # model memang membuat alokasi objek tambahan (array yang mengandung) secara implisit pada setiap panggilan. Ini jarang masalah, tetapi di dalam -lingkaran jenis skenario di mana ia bisa menjadi tidak efisien, kami sarankan menyediakan kelebihan untuk kasus-kasus utama dan menggunakan paramskelebihan untuk hanya kasus tepi. Contohnya adalah StringBuilder.AppendFormat()keluarga kelebihan beban. "
Eliah Kagan
3
@LowFlyingPelican Mono dan .NET Framework tidak sama. Jika Anda melihat versi .NET Framework , ini sebenarnya solusi yang sangat berbeda.
Alex
3
@LowFlyingPelican: Alasan .NET framework adalah kinerja. Alasan Mono untuk menerapkan metode itu adalah kompatibilitas API dengan .NET. Alasan Mono untuk menerapkan metode itu dengan cara itu adalah kesederhanaan implementasi (karena mereka memiliki sumber daya yang jauh lebih sedikit daripada Microsoft).
jhominal
4

Gula sintaksis.

Ketika memanipulasi jalur file, sangat umum untuk memiliki sejumlah kecil nilai tetap. Dalam kasus ini, lebih mudah untuk menggunakannya secara langsung daripada harus mengemasnya menjadi sebuah array.

Gort the Robot
sumber
3
Dengan params, Anda sudah menyuguhkannya. msdn.microsoft.com/en-us/library/w5zay9db.aspx Tidak perlu array.
Thomas Junk
3
Dalam C #, Anda ada benarnya, @ Thomas. Namun, .NET juga mendukung bahasa lain tanpa params.
Karl Bielefeldt
@ThomasJunk Tautan itu sudah mati untuk saya, sayangnya, tapi saya yakin Anda benar karena C # saya biasa-biasa saja. Saya baru saja melihat banyak perpustakaan dengan banyak bahasa yang melakukan itu hanya untuk memungkinkan kode yang lebih bersih.
Gort the Robot