VB.NET'te koşullu üçlü operatör var mı?


446

Perl'de (ve diğer dillerde) bir koşullu üçlü operatör şu şekilde ifade edilebilir:

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

VB.NET'te benzer bir operatör var mı?


13
Üçlü işleç, ikili işleç iki ve tekli işleç bir tane alır gibi, üç işlenen alan herhangi bir işleçtir. ?: İşleci, tanım değil, ternay işlecinin belirli bir örneğidir.
Zooba

Yanıtlar:


597

Sürüme bağlıdır. IfVB.NET 2008'de operatörü bir Üçlü operatör (yanı sıra boş kaynaşma operatörü) 'dir. Bu yeni tanıtıldı, 2008'den önce mevcut değildi. İşte biraz daha bilgi: Visual Basic If duyuru

Misal:

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

[DÜZENLE]

2008'den önce , yukarıda açıklanan operatöre IIfneredeyse aynı şekilde çalıştı If.

Misal:

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

15
2008'den önce, bağlantınızda açıklanan If işleciyle neredeyse aynı şekilde çalışan IIf idi.
Zooba

128
... önemli bir farkla Iif (), bir fonksiyon olarak, hem sonuç hem de alternatifi değerlendirirken, yeni If sadece bunlardan birini değerlendirir.
Greg Hewgill

6
Bunun anlamı ne ? If (koşul, doğru parça, yanlış parça). ayin alabilir miyim
kbvishnu

10
Ben kocaman bir C adamıyım, ama bu sözdizimini geleneksel üçlü operatörden daha temiz buluyorum.
ezmek

11
Bir başka önemli ayrım: Iifher zaman tür bir nesne döndürür Object, oysa If(bool, obj, obj)katı seçenekle tip kontrolüne izin verir. ( Dim var As Integer = Iif(true, 1, 2)tıpkı kolayca yazabildiğiniz için katı seçenekle derlenmeyecektir Dim var As Integer = Iif(true, new Object(), new Object()). Dim var As Integer = If(true, 1, 2)Yine de sıkı bir seçenekle yazabilirsiniz , çünkü iade edilen türü kontrol edecektir.)
Joseph Nields

78

iif, VB6'da bile her zaman VB'de mevcuttur.

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

Gerçek bir işleç değil, Microsoft.VisualBasic ad alanındaki bir işlevdir.


31
Iif yine de üçlü bir operatöre yakın - yani If If Else (veya üçlü operatör) yapacağınız her durumda kullanamazsınız. Örneğin, Değer = Iif (1 = 1, 0, 1/0) patlar, ancak Değer = Eğer (1 = 1, 0, 1/0) olmaz ...
Bip sesi

4
VB, Kısa Devre değerlendirmesini desteklemez (AndAlso operatörü hariç), bu nedenle VB programcıları yarım işlemi güvenli bir şekilde değerlendirebileceklerini gerçekten beklemez. Ancak nokta, iif, geriye dönük uyumluluk için konulan bir hack işlevidir, aksi takdirde gerçek bir operatör olacaktır.
Kris Erickson

39
Tüm VB programcılarını kategorize etmek güzel ;-) Ayrıca kısayol için IsNot ve OrElse de var, bu yüzden VB gerçekten Kısa Devre Değerlendirmesini destekliyor.
HardCode

2
Iif düzenli bir yöntem çağrısıdır ve tüm parametreleri değerlendirir. Üçlü değil. Se dotnetslackers.com/VB_NET/…
LosManos

3
Dediğim gibi, bu gerçek bir operatör DEĞİLDİR ve vb6 kısa devre değerlendirmesini desteklemez, bu nedenle her zaman hatta tüm işlemleri değerlendirir.
Kris Erickson

23

() En yakın eşdeğer ise ancak "Option Strict off" seçeneğini belirlediyseniz örtük dönüşümlere dikkat edin

Örneğin, dikkatli değilseniz, aşağıdaki gibi bir şey denemek isteyebilirsiniz:

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

"Foo" 0 değerini verecek!

Bence '?' C # 'daki operatör eşdeğeri derleme başarısız


8
Sadece bütünlük için, bu ifadeyi yazmanın en iyi yolu Dim foo As Integer? = If( someTrueExpression, New Integer?, 2).
Mark Hurd

9
Bunun da olduğunu unutmayın Option Strict On. Bunun nedeni, NothingVB.NET'te C # 'lara default(T)değil , buna eşdeğer olmasıdır null.
Heinzi

1
Ve şaşkın olan herkes için Integer?nullable anlamına gelir - bkz. Stackoverflow.com/questions/3628757/make-an-integer-null
AjV Jsy

1
Null olabilecek türler için örtük dönüştürmeye takılan herkes için - nedenine ilişkin bu cevaba ve döndürmeden önce argümanı döndüren bir geçici çözüm için bu cevaba bakın ( CType(Nothing, DateTime?).
KyleMit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.