Ini adalah pertanyaan konyol, tetapi Anda dapat menggunakan kode ini untuk memeriksa apakah ada jenis tertentu ...
if (child is IContainer) { //....
Apakah ada cara yang lebih elegan untuk memeriksa contoh "TIDAK"?
if (!(child is IContainer)) { //A little ugly... silly, yes I know...
//these don't work :)
if (child !is IContainer) {
if (child isnt IContainer) {
if (child aint IContainer) {
if (child isnotafreaking IContainer) {
Ya, ya ... pertanyaan konyol ....
Karena ada beberapa pertanyaan tentang seperti apa kode itu, itu hanya pengembalian sederhana di awal suatu metode.
public void Update(DocumentPart part) {
part.Update();
if (!(DocumentPart is IContainer)) { return; }
foreach(DocumentPart child in ((IContainer)part).Children) {
//...etc...
if (!(argument is MapsControlViewModel vm)) { return; }
- Saya bisa membalikkan if dan meletakkan sisa whoooole dari metode di dalam tanda kurung if, tapi kemudian saya akan mendapatkan kode pohon-Natal, dengan banyak tanda kurung tutup di akhir metode. Itu jauh lebih mudah dibaca.ifnot
pernyataanJawaban:
adalah satu-satunya operator yang pergi (tidak ada
IsNot
operator).Anda dapat membangun metode ekstensi yang melakukannya:
dan kemudian menggunakannya untuk:
Dan Anda dapat mengikuti tema Anda:
Perbarui (mempertimbangkan cuplikan kode OP):
Karena Anda benar-benar memberikan nilai setelahnya, Anda bisa menggunakan
as
saja:sumber
IsNot
apa-apa.Anda bisa melakukannya dengan cara ini:
sumber
is
memiliki hak lebih tinggi relatif terhadap==
. Satu-satunya alasan Anda tidak dapat menggunakan!x is f
adalah bahwa itu kurang diutamakan daripada!
.if (a is TextReader reader == false)
"seharusnya" bekerja, tetapi itu tidak akan membiarkan Anda menggunakan variabel di jalur yang benar mengatakan itu mungkin belum diinisialisasi.out
parameter)if (a is TextReader reader == true)
itu berpikir variabel tidak diinisialisasi.Mengapa tidak menggunakan yang lain saja?
Rapi itu akrab dan sederhana?
sumber
Cara Anda memilikinya baik-baik saja tetapi Anda dapat membuat serangkaian metode ekstensi untuk membuat "cara yang lebih elegan untuk memeriksa contoh 'TIDAK'."
Maka Anda bisa menulis:
sumber
Ini belum disebutkan. Ini berfungsi dan saya pikir itu terlihat lebih baik daripada menggunakan
!(child is IContainer)
is
sintaksexpr is constant
:, di mana expr adalah ekspresi untuk dievaluasi, dan konstanta adalah nilai untuk diuji.sumber
if (part as IContainer is null)
. Jujur tidak yakin mana yang lebih baik.Jelek? Saya tidak setuju. Satu-satunya cara lain (saya pribadi berpikir ini "lebih jelek"):
sumber
as
klausa.obj as int
selalu merupakan kesalahan waktu kompilasi.is
formulir.The
is
mengevaluasi operator untuk hasil boolean, sehingga Anda dapat melakukan apa pun yang Anda kalau tidak akan mampu melakukan pada bool. Untuk meniadakannya gunakan!
operator. Mengapa Anda ingin memiliki operator yang berbeda hanya untuk ini?sumber
Metode ekstensi
IsNot<T>
adalah cara yang bagus untuk memperluas sintaksis. Mengingatmelakukan lebih baik daripada melakukan sesuatu seperti
Dalam kasus Anda, tidak masalah karena Anda kembali dari metode. Dengan kata lain, berhati-hatilah untuk tidak melakukan keduanya untuk memeriksa jenis dan kemudian konversi jenis segera setelah.
sumber
Meskipun ini tidak menghindari masalah tanda kurung, demi orang-orang yang datang ke sini melalui Google, harus disebutkan bahwa ada sintaks yang lebih baru (pada C # 7) untuk membuat kode Anda sedikit lebih bersih:
Ini menghindari double-cast, cek-nol, dan memiliki variabel yang tersedia dalam cakupan di mana itu bisa menjadi nol.
sumber
Meskipun operator IS biasanya merupakan cara terbaik, ada alternatif yang dapat Anda gunakan dalam beberapa situasi. Anda dapat menggunakan operator as dan menguji null.
sumber
C # 9 (akan dirilis dengan .NET 5) akan mencakup pola logis
and
,or
dannot
, yang memungkinkan kita untuk menulis ini dengan lebih elegan:Demikian juga, pola ini dapat digunakan untuk memeriksa nol:
Anda dapat menemukan detail lebih lanjut tentang masalah Github melacak perubahan ini.
sumber
sumber