Apakah ada atribut sederhana atau kontrak data yang dapat saya tetapkan ke parameter fungsi yang mencegah null
agar tidak diteruskan di C # /. NET? Idealnya ini juga akan memeriksa pada waktu kompilasi untuk memastikan literal null
tidak digunakan di mana pun untuk itu dan saat run-time throw ArgumentNullException
.
Saat ini saya menulis sesuatu seperti ...
if (null == arg)
throw new ArgumentNullException("arg");
... untuk setiap argumen yang saya harapkan tidak terjadi null
.
Pada catatan yang sama, apakah ada kebalikan dari Nullable<>
hal berikut ini yang akan gagal:
NonNullable<string> s = null; // throw some kind of exception
c#
.net
parameters
null
Neil C. Obremski
sumber
sumber
Jawaban:
Sayangnya, tidak ada yang tersedia pada waktu kompilasi.
Saya memiliki sedikit solusi hacky yang saya posting di blog saya baru-baru ini, yang menggunakan struct dan konversi baru.
Di .NET 4.0 dengan hal-hal Kontrak Kode , hidup akan jauh lebih menyenangkan. Akan lebih baik jika memiliki sintaks bahasa aktual dan dukungan seputar non-nullability, tetapi kontrak kode akan banyak membantu.
Saya juga memiliki metode ekstensi di MiscUtil yang disebut ThrowIfNull yang membuatnya sedikit lebih sederhana.
Satu poin terakhir - ada alasan untuk menggunakan "
if (null == arg)
" daripada "if (arg == null)
"? Saya menemukan yang terakhir lebih mudah dibaca, dan masalah yang diselesaikan sebelumnya di C tidak berlaku untuk C #.sumber
if (null == x)
adalah karena perbedaan bahasa yang alami. Saya percaya ini benar-benar tentang gaya usang yang hanya menyebar melalui contoh, dll.Saya tahu saya sangat terlambat untuk pertanyaan ini, tetapi saya merasa jawabannya akan menjadi relevan karena iterasi utama terbaru dari C # mendekati rilis, kemudian dirilis. Dalam C # 8.0 perubahan besar akan terjadi, C # akan menganggap semua jenis dianggap tidak null.
Menurut Mads Torgersen:
Jadi resolusi yang digariskan oleh Mads, adalah:
Contoh fitur yang diinginkan:
Pratinjau tersedia untuk Visual Studio 2017, 15.5.4+ pratinjau.
sumber
Saya tahu ini adalah pertanyaan yang SANGAT lama, tetapi yang ini hilang di sini:
Jika Anda menggunakan ReSharper / Rider, Anda dapat menggunakan Kerangka Beranotasi .
Sunting : Saya baru saja mendapat -1 acak untuk jawaban ini. Tidak apa-apa. Sadarilah bahwa ini masih valid, meskipun itu bukan lagi pendekatan yang direkomendasikan untuk proyek C # 8.0 + (untuk memahami mengapa, lihat jawaban Greg ).
sumber
Lihat validator di perpustakaan perusahaan. Anda dapat melakukan sesuatu seperti:
Kemudian di kode Anda ketika Anda ingin memvalidasinya:
sumber
bukan yang tercantik tapi:
Anda juga bisa menjadi lebih kreatif dalam metode ContainsNullParameters:
tentu saja Anda bisa menggunakan interseptor atau refleksi tetapi ini mudah diikuti / digunakan dengan sedikit overhead
sumber
return (from o in methodParams where o == null).Count() > 0;
Gunakan:return methodParams.Any(o=>o==null);
akan jauh lebih cepat di koleksi besarOke, balasan ini agak terlambat, tetapi inilah cara saya menyelesaikannya:
Gunakan metode ekstensi ini maka Anda dapat memperlakukan string kosong dan null sebagai hal yang sama.
Misalnya
Tidak ideal saya tahu karena Anda harus ingat untuk memanggil default di mana-mana tetapi ini adalah salah satu solusi.
sumber
string.IsNotNullOrEmpty
benar-benar selain gula memiliki hal yang Anda pedulikan di sebelah kiri. Dapat dimasukkan ke dalam fungsi lain (panjang, rangkaian) dll. Sedikit lebih baik.Default()
) pada null (model.Day
). Saya tahu metode ekstensi tidak diperiksa terhadap null, tetapi mata saya tidak sadar dan mereka sudah membayangkannya?
ke dalam kode:model?.Day?.Default()
:)