Baru-baru ini saya mengetahui bahwa Anda dapat membuat beberapa metode dengan parameter tidak terbatas, misalnya:
SomeMethod(params int[] numbers);
tetapi pertanyaan saya adalah, apa perbedaan antara itu dan hanya membuat metode yang menerima daftar atau array?
SomeMethod(int[] numbers);
SomeMethod(List<int> numbers);
mungkin itu berdampak pada kinerja? Saya tidak sepenuhnya mengerti atau melihat dengan cara apa Anda lebih suka yang dengan parameter tidak terbatas.
Pencarian cepat di google tidak membantu, saya harap Anda bisa membantu saya.
params
juga membutuhkan jenis argumen menjadi array. Jika Anda perlu mengkonsumsi koleksi selain array, mungkin lebih masuk akal untuk memberikanparams
argumen.Console.Write
.Jawaban:
Perbedaan antara
dan
adalah M dapat disebut seperti ini:
atau seperti ini:
tetapi N hanya bisa dipanggil dengan cara kedua , bukan cara pertama .
Dampaknya terhadap kinerja adalah apakah Anda menelepon
M
dengan cara pertama atau cara kedua, baik cara Anda membuat array dibuat. Membuat array memiliki dampak kinerja karena membutuhkan waktu dan memori. Ingatlah bahwa dampak kinerja harus diukur terhadap sasaran kinerja; tidak mungkin bahwa biaya menciptakan array tambahan adalah faktor gating yang merupakan perbedaan antara keberhasilan dan kegagalan di pasar.Ini murni dan sepenuhnya merupakan kemudahan bagi pembuat kode yang memanggil metode; hanya lebih pendek dan lebih mudah untuk ditulis
alih-alih menulis
Ini hanya menghemat beberapa penekanan tombol di sisi pemanggil. Itu semuanya.
Beberapa pertanyaan yang tidak Anda tanyakan tetapi mungkin ingin tahu jawabannya:
Metode yang memungkinkan sejumlah variabel argumen untuk dilewatkan di sisi pemanggil disebut variadic . Metode Params adalah bagaimana C # mengimplementasikan metode variadic.
Ketika dihadapkan dengan masalah resolusi kelebihan beban, C # akan mempertimbangkan bentuk "normal" dan "diperluas", dan bentuk "normal" selalu menang jika keduanya berlaku. Sebagai contoh, pertimbangkan ini:
dan kami memiliki panggilan
Ada dua kemungkinan yang berlaku. Dalam bentuk "normal", kami memanggil
P
dan meneruskan referensi nol untuk array. Dalam formulir "diperluas", kami menyebutnyaP(new object[] { null })
. Dalam hal ini, bentuk normal menang. Jika kami menerima panggilanP(null, null)
maka formulir normal tidak dapat diterapkan dan formulir yang diperluas akan menang secara default.Tantangan : Misalkan kita memiliki
var s = new[] { "hello" };
dan meneleponP(s);
. Jelaskan apa yang terjadi di situs panggilan dan mengapa. Anda mungkin akan terkejut!Tantangan : Misalkan kita memiliki keduanya
void P(object x){}
danvoid P(params object[] x){}
. Apa yangP(null)
dilakukan, dan mengapa?Tantangan : Misalkan kita memiliki keduanya
void M(string x){}
danvoid M(params string[] x){}
. Apa yangM(null)
dilakukan, dan mengapa? Bagaimana ini berbeda dari kasus sebelumnya?sumber
P(null)
vs.P((object)null)
vs.P((object[])null)
- di mana saya bisa menemukan penjelasan untuk perbedaan ini? Rasanya sepertinull
memiliki beberapa tipe khusus , yang mengkonversi ke array daripada objek (P(null)
), tetapi menemukan konversi ke string atau array string ambigu (M(null)
) ... yang terasa sangat aneh, akan mengharapkannya menjadi ambigu dalam kedua kasus atau memilih versi arg tunggal (yang tidak). Tapi saya kira ini lebih tentangparams
menjadi generik , seperti referensi universal (&&
) dalam template C ++, dan dengan demikian lebih cocok (dalam Ch2, bukan di Ch3).object[]
yangobject
, tapi tidak semuaobject
yangobject[]
, karenaobject[]
lebih spesifik.string[]
yangstring
." Bahkan TIDAKstring[]
adastring
dan TIDAKstring
adastring[]
, jadistring
tidak lebih spesifik atau lebih umum daripadastring[]
, dan kami mendapatkan kesalahan ambiguitas ketika diminta untuk memilih.object[]
yangobject
...object[]
lebih spesifik sehinggaP(null)
berlaku untuk array yang lebih spesifik, thx, itulah yang saya hilang. Menemukan beberapa aturan di sini: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…Baru saja melakukan prototipe kecil. Jawabannya
params
adalah gula sintaksis untuk melewatkan dalam array. Itu tidak terlalu mengejutkan. Saya membuat dua versi dari metode yang sama, di mana satu-satunya perbedaan adalah kata kunci "params". IL yang dihasilkan untuk keduanya identik, kecuali bahwa aSystem.ParamArrayAttribute
diterapkan padaparams
versi.Lebih lanjut, IL yang dihasilkan di situs panggilan juga sama antara saya memanggil metode dengan yang dinyatakan secara manual
new int[]
dan memanggil metode hanya menggunakanparams
argumen.Jadi, jawabannya sepertinya "kenyamanan". Tampaknya tidak ada perbedaan dalam kinerja. Anda juga dapat memanggil
params
fungsi dengan array, jadi itu juga tidak terlalu mengejutkan. Turun ke jika pengguna metode Anda lebih mudah untuk memanggilnya dengan sejumlah parameter (misalnyasomeMethod(1, 2, 3)
) daripada harus selalu membuat koleksi terlebih dahulu (misalnyasomeMethod(new List<int>() { 1, 2, 3 } )
).sumber
Fitur parameter tak terbatas menawarkan manfaat berikut dalam banyak skenario:
Berikut adalah contoh di mana opsi parameter tak terbatas adalah pilihan yang bagus
Pertimbangkan bahwa aplikasi untuk mengirim email perlu dibangun.
Fungsi yang mengirim email harus dapat menangani nilai tunggal atau ganda untuk bidang 'Ke', 'CC' dan 'BCC'.
Jika jenis parameter ditetapkan menjadi array atau daftar untuk semua bidang (Ke, CC, BCC), maka fungsi panggilan akan dipaksa untuk berurusan dengan semua kerumitan mendefinisikan 3 array atau daftar untuk memanggil fungsi pengirim email .
Bahkan jika pemanggil ingin mengirim email hanya ke satu alamat, fungsi pengirim email akan memaksa pemanggil untuk menentukan dan mengirim 3 array yang berbeda sebagai parameter.
Jika fungsi pengirim email mengambil pendekatan params tidak terbatas, maka fungsi pemanggil tidak perlu berurusan dengan semua kompleksitas.
Pendekatan parameter tak terbatas berkontribusi pada kinerja runtime aplikasi yang lebih baik dengan menghindari pembuatan array atau daftar di mana pun tidak perlu.
sumber
Dari perspektif non-kinerja , gaya,
params
kata kunci sangat baik untuk dimiliki ketika Anda ingin mengirim daftar parameter opsional.Secara pribadi, saya akan menggunakan
params
ketika kode saya sepertiBagian yang menyenangkan tentang ini adalah saya dapat menggunakan metode ini di semua tempat tanpa harus membuat array atau daftar setiap waktu.
Saya akan menggunakan
array
ataulist
ketika saya tahu saya akan selalu melewati fungsi ini satu set data yang sudah disatukan sepertiSaya melihat manfaat dari
params
fleksibilitas yang ditambahkannya. Ini mungkin dampak yang relatif kecil untuk kode Anda, tetapi masih merupakan alat yang bagus untuk memilikinya.sumber
Konvensi panggilan berbeda. Sebagai contoh ...
Dalam kasus pertama, Anda dapat mengirimkan sebanyak int sebagai parameter terpisah ke metode. Pada yang kedua, Anda perlu membuat instance daftar dan meneruskannya.
sumber