Saya tahu ini adalah pertanyaan mendasar, tetapi saya tidak dapat menemukan jawaban.
Kenapa menggunakannya? jika Anda menulis fungsi atau metode yang menggunakannya, ketika Anda menghapusnya kode akan tetap berfungsi dengan baik, 100% tanpa itu. Misalnya:
Dengan params:
static public int addTwoEach(params int[] args)
{
int sum = 0;
foreach (var item in args)
sum += item + 2;
return sum;
}
Tanpa params:
static public int addTwoEach(int[] args)
{
int sum = 0;
foreach (var item in args)
sum += item + 2;
return sum;
}
c#
parameter-passing
params
variadic-functions
variadic
MasterMastic
sumber
sumber
*
parameter awalan asterisk ( ) seperti yang disebutkan di sini .Jawaban:
Dengan
params
Anda dapat memanggil metode Anda seperti ini:Tanpanya
params
, Anda tidak bisa.Selain itu, Anda dapat memanggil metode dengan array sebagai parameter dalam kedua kasus :
Artinya,
params
memungkinkan Anda untuk menggunakan jalan pintas saat memanggil metode.Tidak terkait, Anda dapat mempersingkat metode Anda secara drastis:
sumber
System.Linq
namespace :)return args.Select(x => x + 2).Sum();
params
Anda mengunci diri dari menambahkan argumen metode tambahan tanpa melanggar penelepon atau resolusi metode Anda.Menggunakan
params
memungkinkan Anda untuk memanggil fungsi tanpa argumen. Tanpaparams
:Bandingkan dengan
params
:Secara umum, Anda dapat menggunakan params ketika jumlah argumen dapat bervariasi dari 0 hingga tak terbatas, dan menggunakan array ketika jumlah argumen bervariasi dari 1 hingga tak terbatas.
sumber
new int[0]
. semoga ini membantu! :)Ini memungkinkan Anda untuk menambahkan sebanyak mungkin parameter tipe dasar dalam panggilan Anda.
sedangkan dengan bentuk kedua Anda harus menggunakan array sebagai parameter
sumber
Satu bahaya dengan
params
Kata Kunci adalah, jika setelah Panggilan ke Kode telah dikodekan,params
Parameter sebelum perubahan Signature adalah Type-Kompatibel denganparams
Parameter,Panggilan tersebut akan terus dikompilasi dengan satu / lebih Ekspresi yang sebelumnya dimaksudkan untuk Parameter yang diperlukan diperlakukan sebagai
params
Parameter opsional . Saya baru saja menemukan kasus terburuk yang mungkin terjadi:params
Parameternya Typeobject[]
.Ini patut diperhatikan karena pengembang terbiasa dengan kompilator yang menampar pergelangan tangan mereka dengan skenario yang jauh lebih umum di mana Parameter dihapus dari Metode dengan semua Parameter yang diperlukan (karena # Parameter yang diharapkan akan berubah).
Bagi saya, itu tidak sepadan dengan jalan pintas.
(Type)[]
tanpaparams
akan bekerja dengan 0 hingga tak terhingga # dari Parameter tanpa perlu Override. Kasus terburuk adalah Anda harus menambahkan, new (Type) [] {}
ke Panggilan di mana itu tidak berlaku.Btw, imho, praktik paling aman (dan paling mudah dibaca) adalah:
lewat Parameter Bernama (yang sekarang dapat kita lakukan bahkan dalam C # ~ 2 dekade setelah kita dapat dalam VB; P) (karena:
1.1. itu satu - satunya cara yang menjamin pencegahan nilai yang tidak disengaja diteruskan ke Parameter setelah urutan Parameter, Jenis Kompatibel dan / atau perubahan jumlah setelah Panggilan dikodekan,
1.2. itu mengurangi peluang tersebut setelah perubahan makna Parameter, karena kemungkinan nama pengidentifikasi baru yang mencerminkan makna baru tepat di sebelah nilai yang diteruskan ke sana,
1.3. itu menghindari keharusan untuk menghitung koma dan melompat-balik dari Call to Signature untuk melihat Ekspresi apa yang diberikan untuk Parameter apa, dan
1.3.1. By the way, alasan ini saja harus banyak (dalam hal menghindari pelanggaran sering rawan dari Prinsip KERING hanya untuk membaca kode belum lagi juga memodifikasinya ), tetapi alasan ini bisa secara eksponensial lebih penting jika ada satu / lebih banyak Ekspresi yang Lulus yang mengandung koma, yaitu Array Multi-Dimensi atau Panggilan Fungsi Multi-Parameter. Dalam hal ini, Anda bahkan tidak bisa menggunakan (yang bahkan jika Anda bisa, masih akan menambahkan langkah ekstra per Parameter per Panggilan Metode) a Temukan Semua Kejadian dalam fitur Pilihan di editor Anda untuk mengotomatiskan penghitungan koma untuk Anda.
1.4. jika Anda harus menggunakan Parameter Opsional (
params
atau tidak), ini memungkinkan Anda untuk mencari Panggilan di mana Parameter Opsional tertentu dilewati (dan oleh karena itu, kemungkinan besar tidak atau setidaknya memiliki kemungkinan bukan Nilai Default),(CATATAN: Alasan 1.2. Dan 1.3. Dapat memudahkan dan mengurangi kemungkinan kesalahan bahkan pada pengkodean Panggilan awal belum lagi ketika Panggilan harus dibaca dan / atau diubah.))
dan
lakukan SATU - PARAMETER - PER - LINE untuk keterbacaan yang lebih baik (karena:
2.1. itu kurang berantakan, dan
2.2. ia menghindari keharusan menggulir ke kanan & belakang kiri (dan harus melakukannya PER - LINE, karena kebanyakan manusia tidak dapat membaca bagian kiri dari banyak baris, gulir ke kanan dan baca bagian kanan)).
2.3. ini konsisten dengan "Praktik Terbaik" yang telah kami kembangkan untuk Pernyataan Tugas, karena setiap Parameter yang Lulus pada dasarnya adalah Pernyataan Tugas (memberikan Nilai atau Referensi ke Variabel Lokal). Sama seperti mereka yang mengikuti "Praktik Terbaik" terbaru dalam Gaya Pengkodean tidak akan bermimpi mengkode beberapa Pernyataan Tugas per baris, kita mungkin tidak seharusnya (dan tidak akan pernah "Praktik Terbaik" mengejar "jenius" saya; ) melakukannya saat Melewati Parameter.
CATATAN :
Melewati Variabel yang namanya mencerminkan Parameter 'tidak membantu ketika:
1.1. Anda melewati Konstanta Literal (yaitu 0/1 sederhana, salah / benar atau nol yang bahkan "'Praktik Terbaik'" mungkin tidak mengharuskan Anda menggunakan Konstan Bernama untuk dan tujuannya tidak dapat dengan mudah disimpulkan dari nama Metode ),
1.2. Metode ini secara signifikan lebih rendah-tingkat / lebih umum daripada Penelepon sehingga Anda tidak ingin / dapat memberi nama Variabel Anda sama / mirip dengan Parameter (atau sebaliknya), atau
1.3. Anda sedang memesan ulang / mengganti Parameter di Signature yang dapat mengakibatkan Panggilan sebelum masih Kompilasi karena Jenis terjadi masih kompatibel.
Memiliki fitur auto-wrap seperti VS tidak hanya menghilangkan SATU (# 2.2) dari 8 alasan yang saya berikan di atas. Sebelum VS 2015, itu TIDAK otomatis inden (!?! Sungguh, MS?!?) Yang meningkatkan keparahan alasan # 2.1.
VS harus memiliki opsi yang menghasilkan snippet Pemanggilan Metode dengan Parameter Bernama (satu per baris tentu saja; P) dan opsi kompiler yang memerlukan Parameter Bernama (serupa dalam konsep dengan Option Explicit di VB yang, btw, persyaratannya sangat banyak sekali dipikirkan sama-sama keterlaluan tapi sekarang banyak dibutuhkan oleh "'Praktik Terbaik'"). Bahkan, "kembali ke sayahari ";), pada tahun 1991 hanya beberapa bulan dalam karier saya, bahkan sebelum saya menggunakan (atau bahkan telah melihat) bahasa dengan Parameter Bernama, saya memiliki anti-domba /" hanya karena Anda bisa, jangan berarti Anda harus " Saya tidak secara membuta "memotong ujung daging panggang" cukup masuk akal untuk mensimulasikannya (menggunakan komentar sebaris) tanpa melihat ada orang yang melakukannya. Tidak harus menggunakan Parameter Bernama (juga sintaks lainnya yang menyimpan "'berharga'" kode sumber penekanan tombol) adalah peninggalan era Kartu Punch ketika sebagian besar sintaks ini dimulai.Tidak ada alasan untuk itu dengan perangkat keras modern dan IDE dan perangkat lunak yang jauh lebih kompleks di mana keterbacaannya jauh, Banyak, JAUHlebih penting. "Kode dibaca lebih sering daripada yang tertulis". Selama Anda tidak menduplikasi kode yang tidak diperbarui secara otomatis, setiap keystroke yang disimpan kemungkinan akan lebih mahal secara eksponensial ketika seseorang (bahkan diri Anda) mencoba membacanya nanti.
sumber
null
ataunew object[0]
sebagai argumen.myMethod
sebagaivoid myMethod(int requiredInt, params int[] optionalInts)
. I / orang kode lain satu / lebih panggilan, yaitumyMethod(1)
,myMethod(1, 21)
,myMethod(1, 21, 22)
. Saya berubahmyMethod
menjadivoid myMethod(params int[] optionalInts)
. Semua panggilan itu masih akan dikompilasi tanpa kesalahan meskipun parameter pertama ("1") jelas tidak dimaksudkan untuk diteruskan sebagai elemen pertama darioptionalInts
Parameter.Tidak perlu membuat metode overload, cukup gunakan satu metode tunggal dengan params seperti yang ditunjukkan di bawah ini
sumber
params
atau tanpa kami hanya akan melewati jenis koleksi untuk menutupi jumlah koleksi.params
juga memungkinkan Anda memanggil metode dengan satu argumen.yaitu
Foo(1);
bukannyaFoo(new int[] { 1 });
. Dapat berguna untuk steno dalam skenario di mana Anda mungkin harus memberikan nilai tunggal daripada seluruh array. Ini masih ditangani dengan cara yang sama dalam metode ini, tetapi memberikan beberapa permen untuk memanggil dengan cara ini.sumber
Menambahkan kata kunci params itu sendiri menunjukkan bahwa Anda dapat melewati beberapa parameter saat memanggil metode yang tidak mungkin dilakukan tanpa menggunakannya. Untuk lebih spesifik:
Ketika Anda akan memanggil metode di atas, Anda dapat memanggilnya dengan salah satu cara berikut:
addTwoEach()
addTwoEach(1)
addTwoEach(new int[]{ 1, 2, 3, 4 })
Tetapi ketika Anda akan menghapus kata kunci params hanya cara ketiga dari cara yang diberikan di atas akan bekerja dengan baik. Untuk kasus 1 dan 2 Anda akan mendapatkan kesalahan.
sumber
Satu hal lagi yang perlu disorot. Lebih baik digunakan
params
karena lebih baik untuk kinerja. Saat Anda memanggil metode denganparams
argumen dan tidak memberikan apa pun:panggilan:
Kemudian versi baru dari .Net Framework melakukan ini (dari .Net Framework 4.6):
Array.Empty
Objek ini dapat digunakan kembali oleh kerangka kerja nanti, sehingga tidak perlu melakukan alokasi berlebihan. Alokasi ini akan terjadi ketika Anda memanggil metode ini seperti ini:sumber
Mungkin terdengar bodoh, Tapi Params tidak mengizinkan array multidimensi. Sedangkan Anda bisa meneruskan array multidimensi ke suatu fungsi.
sumber
Contoh lain
sumber