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?

Jim Counts
sumber
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)
Bip bip
sumber
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.

Kris Erickson
sumber
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

tidak dikenal
sumber
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