Apakah ada operator ternary kondisional di VB.NET?


446

Dalam Perl (dan bahasa lain), operator ternary kondisional dapat diekspresikan seperti ini:

my $foo = $bar == $buz ? $cat : $dog;

Apakah ada operator serupa di VB.NET?


13
Operator ternary adalah setiap operator yang mengambil tiga operan, sama seperti operator biner mengambil dua dan operator unary mengambil satu. Operator?: Adalah contoh spesifik dari operator ternay, bukan definisi.
— Zooba

Jawaban:


597

Tergantung pada versi. The Ifoperator dalam VB.NET 2008 merupakan operator ternary (serta operator perpaduan null). Ini baru saja diperkenalkan, sebelum 2008 ini tidak tersedia. Berikut beberapa info lebih lanjut: Visual Basic If pengumuman

Contoh:

Dim foo as String = If(bar = buz, cat, dog)

[EDIT]

Sebelum 2008 itu IIf, yang bekerja hampir identik denganIf operator yang dijelaskan di atas.

Contoh:

Dim foo as String = IIf(bar = buz, cat, dog)

15
Sebelum 2008 itu adalah IIf, yang bekerja hampir identik dengan operator If yang dijelaskan dalam tautan Anda.
— Zooba

128
... dengan perbedaan penting bahwa Iif (), sebagai fungsi, selalu mengevaluasi konsekuensi dan alternatifnya, sedangkan If baru mengevaluasi salah satunya.
— Greg Hewgill

6
apa artinya? Jika (kondisi, bagian-benar, bagian salah). bolehkah saya ritus?
— kbvishnu

10
Saya pria C yang besar, tetapi saya menemukan sintaks ini lebih bersih daripada operator ternary tradisional.
— naksir

11
Perbedaan penting lainnya: Iifselalu mengembalikan objek tipe Object, sedangkan If(bool, obj, obj)memungkinkan untuk memeriksa tipe dengan opsi ketat. ( Dim var As Integer = Iif(true, 1, 2)tidak akan mengkompilasi dengan opsi ketat karena Anda bisa dengan mudah menulis Dim var As Integer = Iif(true, new Object(), new Object()). Anda BISA menulis Dim var As Integer = If(true, 1, 2)dengan opsi ketat pada, karena itu akan memeriksa jenis yang dikembalikan.)
— Joseph Nields

78

iif selalu tersedia di VB, bahkan di VB6.

Dim foo as String = iif(bar = buz, cat, dog)

Ini bukan operator sejati, karena itu, tetapi sebuah fungsi dalam namespace Microsoft.Visual.


31
Iif hanya dekat dengan operator ternary - yang berarti Anda tidak dapat menggunakannya dalam setiap kondisi yang Anda inginkan dengan If Then Else (atau operator ternary). Misalnya, Nilai = Iif (1 = 1, 0, 1/0) akan meledak, tetapi Nilai = Jika (1 = 1, 0, 1/0) tidak akan ...
— Bip bip

4
VB tidak mendukung evaluasi Sirkuit Pendek (kecuali untuk operator AndAlso), sehingga programmer VB tidak benar-benar berharap bahwa mereka dapat dengan aman mengevaluasi setengah operasi. Tapi poin yang diambil, juga iif adalah fungsi hack yang digunakan untuk kompatibilitas mundur jika tidak akan menjadi operator nyata.
— Kris Erickson

39
Senang mengkategorikan semua programmer VB ;-) Dan ada juga IsNot dan OrElse untuk pintasan, jadi VB memang mendukung Evaluasi Sirkuit Pendek.
— HardCode

2
Iif adalah pemanggilan metode biasa dan mengevaluasi semua parameter. Itu bukan ternary. Se dotnetslackers.com/VB_NET/…
— LosManos

3
Seperti yang saya nyatakan, ini BUKAN operator sejati, dan vb6 tidak mendukung evaluasi hubung singkat sehingga tetap mengevaluasi semua operasi secara on-line.
— Kris Erickson

23

If () adalah padanan terdekat tapi waspadalah terhadap konversi implisit yang terjadi jika Anda telah menyetel "Option Strict off"

Misalnya, jika Anda tidak hati-hati, Anda mungkin tergoda untuk mencoba sesuatu seperti:

Dim foo As Integer? = If( someTrueExpression, Nothing, 2)

Akan memberi "foo" nilai 0!

Saya pikir '?' operator yang setara dalam C # malah akan gagal kompilasi


8
Hanya untuk kelengkapan, cara terbaik untuk menulis ungkapan itu adalah Dim foo As Integer? = If( someTrueExpression, New Integer?, 2).
— Mark Hurd

9
Perhatikan bahwa ini juga terjadi dengan Option Strict On. Alasannya adalah bahwa Nothingdalam VB.NET setara dengan C # default(T)daripada null.
— Heinzi

1
Dan bagi siapa pun yang bingung dengan Integer?itu berarti nullable - lihat stackoverflow.com/questions/3628757/make-an-integer-null
— AjV Jsy

1
Untuk siapa pun yang terjebak pada konversi implisit untuk jenis nullable - lihat jawaban ini tentang mengapa dan jawaban ini untuk pemecahan masalah yang melemparkan argumen sebelum kembali ( CType(Nothing, DateTime?).
— KyleMit
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.