Apakah C # 4.0 mengizinkan opsi out
atau ref
argumen?
c#-4.0
optional-parameters
optional-arguments
Joe Daley
sumber
sumber
null
default ( saya berasal dari PHP ) dan pengujian untuknull
melanjutkan dengan mengisi argumen ( bagi mereka yang akrab, pikirkanpreg_match()
) Bagaimanapun, sementara saya mengerti dari sudut pandang teknis, saat ini mungkin tidak mungkin, dan bahwa PHP dan C # agak tak tertandingi, itu masih akan menjadi alat " bagus " untuk tersedia.Jawaban:
Seperti yang telah disebutkan, ini sama sekali tidak diperbolehkan dan saya pikir itu masuk akal. Namun, untuk menambahkan lebih banyak detail, berikut adalah kutipan dari Spesifikasi C # 4.0 , bagian 21.1:
sumber
Tidak.
Solusinya adalah kelebihan dengan metode lain yang tidak memiliki parameter out / ref, dan yang hanya memanggil metode Anda saat ini.
Pembaruan: Jika Anda memiliki C # 7.0 , Anda dapat menyederhanakan:
(Terima kasih @Oskar / @Reiner karena menunjukkan ini.)
sumber
return SomeMethod(out string temp)
. Lihat lebih lanjut di sini: blogs.msdn.microsoft.com/dotnet/2016/08/24/…return SomeMethod(out _);
Tidak, tetapi alternatif hebat lainnya adalah memiliki metode yang menggunakan kelas templat generik untuk parameter opsional sebagai berikut:
Maka Anda dapat menggunakannya sebagai berikut:
sumber
Sebenarnya ada cara untuk melakukan ini yang diizinkan oleh C #. Ini akan kembali ke C ++, dan agak melanggar struktur Berorientasi Objek C # yang bagus.
GUNAKAN METODE INI DENGAN AWAS!
Inilah cara Anda mendeklarasikan dan menulis fungsi Anda dengan parameter opsional:
Kemudian panggil fungsi seperti ini:
Untuk mengkompilasi ini, Anda harus mengaktifkan kode yang tidak aman dalam opsi proyek. Ini adalah solusi yang sangat aneh yang biasanya tidak boleh digunakan, tetapi jika Anda untuk beberapa keputusan aneh, misterius, misterius, diilhami manajemen, BENAR-BENAR membutuhkan parameter keluar opsional di C #, maka ini akan memungkinkan Anda untuk melakukan hal itu.
sumber
ICYMI: Termasuk pada fitur baru untuk C # 7.0 yang disebutkan di sini , "discards" sekarang diizinkan sebagai parameter dalam bentuk _, untuk membiarkan Anda mengabaikan parameter yang tidak Anda pedulikan:
p.GetCoordinates(out var x, out _); // I only care about x
NB jika Anda juga bingung dengan bagian "out var x", baca fitur baru tentang "Variabel Keluar" pada tautan juga.
sumber
Tidak, tetapi Anda dapat menggunakan delegasi (mis.
Action
) Sebagai alternatif.Terinspirasi sebagian oleh jawaban Robin R ketika menghadapi situasi di mana saya pikir saya ingin parameter opsional keluar, saya malah menggunakan
Action
delegasi. Saya telah meminjam kode contohnya untuk dimodifikasi agar dapat digunakanAction<int>
untuk menunjukkan perbedaan dan persamaan:Ini memiliki keuntungan bahwa variabel opsional muncul di sumber sebagai int normal (kompiler membungkusnya dalam kelas penutupan, daripada kita membungkusnya secara eksplisit dalam kelas yang ditentukan pengguna).
Variabel perlu inisialisasi eksplisit karena kompiler tidak dapat berasumsi bahwa
Action
akan dipanggil sebelum panggilan fungsi keluar.Ini tidak cocok untuk semua kasus penggunaan, tetapi bekerja dengan baik untuk kasus penggunaan nyata saya (fungsi yang menyediakan data untuk tes unit, dan di mana tes unit baru membutuhkan akses ke beberapa keadaan internal yang tidak ada dalam nilai balik).
sumber
Gunakan metode kelebihan beban tanpa parameter keluar untuk memanggil yang dengan parameter keluar untuk C # 6.0 dan lebih rendah. Saya tidak yakin mengapa C # 7.0 untuk .NET Core bahkan merupakan jawaban yang tepat untuk utas ini ketika ditanya apakah C # 4.0 dapat memiliki parameter keluar opsional. Jawabannya adalah tidak!
sumber
Bagaimana dengan ini?
Anda masih harus meneruskan nilai ke parameter dari C # tetapi ini merupakan parameter referensi opsional.
sumber
[Optional]
anotasi. Ini tidak membantu.sumber