Catatan: Pertanyaan ini ditanyakan pada saat C # belum mendukung parameter opsional (yaitu sebelum C # 4).
Kami sedang membangun API web yang dihasilkan secara programatis dari kelas C #. Kelas memiliki metode GetFooBar(int a, int b)
dan API memiliki metode yang GetFooBar
mengambil params permintaan seperti &a=foo &b=bar
.
Kelas perlu mendukung parameter opsional, yang tidak didukung dalam bahasa C #. Apa pendekatan terbaik?
c#
optional-parameters
Kalid
sumber
sumber
Jawaban:
Terkejut tidak ada yang menyebutkan parameter opsional C # 4.0 yang berfungsi seperti ini:
Sunting: Saya tahu bahwa pada saat pertanyaan itu diajukan, C # 4.0 tidak ada. Tapi pertanyaan ini masih menduduki peringkat # 1 di Google untuk "argumen opsional C #" jadi saya pikir - jawaban ini layak berada di sini. Maaf.
sumber
Pilihan lain adalah menggunakan kata kunci params
Disebut seperti ...
sumber
public void log (params object[] args){ StringBuilder sb = new StringBuilder(); for (int i = 0; i < args.Length; i++){ sb.Append("{"); sb.Append(i.ToString()); sb.Append("}"); sb.Append(" "); } String.Format(sb.ToString(),args).Dump(); }
Contoh panggilan:log("...Done,",(watch.ElapsedMilliseconds/1000).ToString(),"s");
Dalam C #, saya biasanya menggunakan beberapa bentuk metode:
UPDATE: Ini disebutkan di atas adalah cara saya melakukan nilai default dengan C # 2.0. Proyek yang saya kerjakan sekarang menggunakan C # 4.0 yang sekarang secara langsung mendukung parameter opsional. Ini adalah contoh yang baru saja saya gunakan dalam kode saya sendiri:
sumber
Dari situs ini:
http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1
C # memungkinkan penggunaan atribut [Opsional] (dari VB, meskipun tidak berfungsi dalam C #). Jadi Anda dapat memiliki metode seperti ini:
Di bungkus API kami, kami mendeteksi parameter opsional (ParameterInfo p.IsOptional) dan menetapkan nilai default. Tujuannya adalah untuk menandai parameter sebagai opsional tanpa menggunakan kludges seperti memiliki "opsional" dalam nama parameter.
sumber
Anda dapat menggunakan metode kelebihan ...
Tergantung pada tanda tangan metode, contoh yang saya berikan tidak memiliki metode "int b" saja karena akan memiliki tanda tangan yang sama dengan metode "int a".
Anda dapat menggunakan jenis Nullable ...
Anda kemudian dapat memeriksa, menggunakan Nilai., Untuk melihat apakah suatu parameter telah ditetapkan.
Opsi lain adalah menggunakan parameter 'params'.
Jika Anda ingin menggunakan parameter bernama perlu membuat tipe untuk menanganinya, meskipun saya pikir sudah ada sesuatu seperti ini untuk aplikasi web.
sumber
Anda dapat menggunakan parameter opsional di C # 4.0 tanpa khawatir. Jika kita memiliki metode seperti:
ketika Anda memanggil metode, Anda dapat melewati parameter seperti ini:
C # 4.0 mengimplementasikan fitur yang disebut "parameter bernama", Anda benar-benar dapat melewati parameter dengan nama mereka, dan tentu saja Anda dapat melewati parameter dalam urutan apa pun yang Anda inginkan :)
sumber
Halo Dunia Opsional
Jika Anda ingin runtime memberikan nilai parameter default, Anda harus menggunakan refleksi untuk melakukan panggilan. Tidak sebagus saran lain untuk pertanyaan ini, tetapi kompatibel dengan VB.NET.
sumber
Cara mudah yang memungkinkan Anda menghilangkan parameter apa pun di posisi apa pun , adalah memanfaatkan jenis yang dapat dibatalkan sebagai berikut:
String sudah merupakan tipe yang dapat dibatalkan sehingga mereka tidak membutuhkannya ? .
Setelah Anda memiliki metode ini, semua panggilan berikut ini valid :
Ketika Anda mendefinisikan suatu metode dengan cara itu Anda memiliki kebebasan untuk mengatur hanya parameter yang Anda inginkan dengan memberi nama mereka. Lihat tautan berikut untuk informasi lebih lanjut tentang parameter bernama dan opsional:
Bernama dan Argumen Opsional (Panduan Pemrograman C #) @ MSDN
sumber
Saya setuju dengan stephenbayer. Tetapi karena ini adalah layanan web, lebih mudah bagi pengguna akhir untuk menggunakan hanya satu bentuk metode web, daripada menggunakan beberapa versi dari metode yang sama. Saya pikir dalam situasi ini Jenis Nullable sempurna untuk parameter opsional.
sumber
parameter opsional untuk metode. jika Anda memerlukan argumen opsional untuk suatu kelas dan Anda adalah:
menggunakan c # 4.0: gunakan argumen opsional dalam konstruktor kelas, solusi yang saya sukai, karena lebih dekat dengan apa yang dilakukan dengan metode, jadi lebih mudah diingat. ini sebuah contoh:
menggunakan versi c # sebelumnya ke c # 4.0: Anda harus menggunakan chaining konstruktor (menggunakan: kata kunci ini), di mana konstruktor yang lebih sederhana mengarah ke "master konstruktor". contoh:
sumber
Cara khas ini ditangani dalam C # seperti langkah yang disebutkan adalah untuk membebani metode. Dengan membuat beberapa versi metode dengan berbagai parameter Anda secara efektif membuat parameter opsional. Dalam formulir dengan parameter yang lebih sedikit, Anda biasanya akan memanggil formulir metode dengan semua parameter yang menetapkan nilai default Anda dalam panggilan ke metode itu.
sumber
Anda dapat membebani metode Anda secara berlebihan. Satu metode berisi satu parameter
GetFooBar(int a)
dan yang lainnya berisi kedua parameter,GetFooBar(int a, int b)
sumber
Menggunakan kelebihan beban atau menggunakan C # 4.0 atau lebih tinggi
sumber
Untuk sejumlah besar parameter opsional, satu parameter Kamus dapat digunakan dengan metode ContainsKey. Saya suka pendekatan ini karena memungkinkan saya untuk lulus Daftar atau T secara individual tanpa harus membuat metode lain (misalnya parameter yang bagus digunakan sebagai filter).
Contoh (Kamus baru <string, Obyek> () akan diteruskan jika tidak ada parameter opsional yang diinginkan):
sumber
Alih-alih parameter default, mengapa tidak hanya membangun kelas kamus dari querystring berlalu .. implementasi yang hampir identik dengan cara bentuk asp.net bekerja dengan querystrings.
yaitu Request.QueryString ["a"]
Ini akan memisahkan kelas daun dari kode pabrik / boilerplate.
Anda juga mungkin ingin memeriksa Layanan Web dengan ASP.NET . Layanan web adalah api web yang dihasilkan secara otomatis melalui atribut pada kelas C #.
sumber
Sedikit terlambat ke pesta, tetapi saya sedang mencari jawaban untuk pertanyaan ini dan akhirnya menemukan cara lain untuk melakukan ini. Deklarasikan tipe data untuk argumen opsional metode web Anda menjadi tipe XmlNode. Jika arg opsional dihilangkan, ini akan disetel ke nol, dan jika ada, Anda bisa mendapatkan nilai string dengan memanggil arg.Value, yaitu,
Apa yang juga layak tentang pendekatan ini adalah halaman beranda .NET yang dihasilkan untuk ws masih menampilkan daftar argumen (meskipun Anda kehilangan kotak entri teks berguna untuk pengujian).
sumber
Saya memiliki layanan web untuk menulis yang membutuhkan 7 parameter. Masing-masing adalah atribut kueri opsional ke pernyataan sql yang dibungkus oleh layanan web ini. Jadi dua solusi untuk param non-opsional muncul dalam pikiran ... keduanya sangat buruk:
method1 (param1, param2, param 3, param 4, param 5, param 6, param7) method1 (param1, param2, param3, param 4, param5, param 6) metode 1 (param1, param2, param3, param4, param5, param7, param7 ) ... mulai melihat gambar. Dengan cara ini ada kegilaan. Terlalu banyak kombinasi.
Sekarang untuk cara yang lebih sederhana yang terlihat canggung tetapi harus bekerja: method1 (param1, bool useParam1, param2, bool useParam2, dll ...)
Itu satu panggilan metode, nilai untuk semua parameter diperlukan, dan itu akan menangani setiap kasus di dalamnya. Juga jelas cara menggunakannya dari antarmuka.
Ini hack, tapi itu akan berhasil.
sumber
Saya harus melakukan ini di VB.Net 2.0 Web Service. Saya akhirnya menetapkan parameter sebagai string, lalu mengubahnya menjadi apa pun yang saya butuhkan. Parameter opsional ditentukan dengan string kosong. Bukan solusi terbersih, tetapi berhasil. Berhati-hatilah agar Anda menangkap semua pengecualian yang dapat terjadi.
sumber
Untuk berjaga-jaga jika seseorang ingin meneruskan panggilan balik (atau
delegate
) sebagai parameter opsional, dapat melakukannya dengan cara ini.Parameter Panggilan Balik opsional:
sumber
parameter opsional tidak lain adalah parameter default! saya sarankan Anda memberikan keduanya parameter default. GetFooBar (int a = 0, int b = 0) jika Anda tidak memiliki metode kelebihan beban, akan menghasilkan a = 0, b = 0 jika Anda tidak melewati nilai apa pun, jika Anda melewati nilai 1, akan menghasilkan , nilai lulus untuk a, 0 dan jika Anda melewati 2 nilai 1 akan ditugaskan ke a dan kedua ke b.
berharap itu menjawab pertanyaan Anda.
sumber
Dalam kasus ketika nilai-nilai default tidak tersedia, cara untuk menambahkan parameter opsional adalah dengan menggunakan kelas .NET OptionalAttribute - https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.optionalattribute ? view = netframework-4.8
Contoh kode di bawah ini:
sumber
Anda dapat mencoba ini juga
Tipe 1
public void YourMethod(int a=0, int b = 0) { //some code }
Tipe 2
public void YourMethod(int? a, int? b) { //some code }
sumber