Има ли условен троичен оператор във VB.NET?

В Perl (и други езици) условният троичен оператор може да бъде изразен по следния начин:

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

Има ли подобен оператор във VB.NET?


person Jim Counts    schedule 23.02.2009    source източник
comment
Троичен оператор е всеки оператор, който приема три операнда, подобно на двоичния оператор, който приема два, а унарния оператор - един. Операторът ?: е конкретен пример за ternay оператор, а не дефиницията.   -  person Zooba    schedule 23.02.2009


Отговори (4)


Зависи от версията. Операторът If във VB.NET 2008 е троичен оператор (както и нулев оператор за сливане). Това току-що беше въведено, преди 2008 г. това не беше налично. Ето малко повече информация: съобщение на Visual Basic If

Пример:

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

[РЕДАКТИРАНЕ]

Преди 2008 беше IIf, който работеше почти идентично с оператора If, описан по-горе.

Пример:

Dim foo as String = IIf(bar = buz, cat, dog)
person Beep beep    schedule 23.02.2009
comment
Преди 2008 беше IIf, който работеше почти идентично с оператора If, описан във вашата връзка. - person Zooba; 23.02.2009
comment
...с важната разлика, че Iif(), бидейки функция, винаги оценява както следствието, така и алтернативата, докато новият If оценява само един от тях. - person Greg Hewgill; 23.02.2009
comment
какво означава Ако (условие, вярна част, невярна част). мога ли да обредя? - person kbvishnu; 20.01.2012
comment
Аз съм страхотен човек на C, но намирам този синтаксис за по-чист от традиционния троичен оператор. - person crush; 10.02.2015
comment
Друго важно разграничение: Iif винаги връща обект от тип Object, докато If(bool, obj, obj) позволява проверка на типа с опция strict on. (Dim var As Integer = Iif(true, 1, 2) няма да се компилира с опция strict on, защото бихте могли също толкова лесно да напишете Dim var As Integer = Iif(true, new Object(), new Object()). Въпреки това МОЖЕТЕ да напишете Dim var As Integer = If(true, 1, 2) с опция strict on, защото ще провери върнатия тип.) - person Joseph Nields; 21.04.2015

iif винаги е бил наличен във VB, дори и във VB6.

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

Това не е истински оператор като такъв, а функция в пространството на имената на Microsoft.VisualBasic.

person Kris Erickson    schedule 23.02.2009
comment
Iif обаче е близо само до троичен оператор - което означава, че не можете да го използвате във всяко условие, което бихте използвали If Then Else (или троичен оператор). Например, Value = Iif(1 = 1, 0, 1/0) би избухнало, но Value = If(1 = 1, 0, 1/0) няма да ... - person Beep beep; 23.02.2009
comment
VB не поддържа оценка на късо съединение (с изключение на оператора AndAlso), така че VB програмистите наистина не очакват, че могат безопасно да оценят половината операция. Но разбира се, също iif е функция за хакване, която е въведена за обратна съвместимост, в противен случай би била истински оператор. - person Kris Erickson; 23.02.2009
comment
Хубаво е да категоризирате всички VB програмисти ;-) И има също IsNot и OrElse за пряк път, така че VB наистина поддържа оценка на късо съединение. - person HardCode; 23.02.2009
comment
Iif е редовно извикване на метод и оценява всички параметри. Не е троичен. Вижте dotnetslackers.com/VB_NET/ - person LosManos; 18.12.2012
comment
Както казах, това НЕ е истински оператор и vb6 не поддържа оценка на късо съединение, така че така или иначе винаги оценява всички операции онлайн. - person Kris Erickson; 18.12.2012
comment
Метод IIf е част от пространството на имената на Microsoft.VisualBasic, което не е съвместимо с други .NET езици. Така че по-добра практика е да използвате метода If(). - person Aave; 17.10.2018
comment
@Aave: пространството от имена със сигурност е съвместимо с други езици, тази конкретна функция винаги е била доста безсмислена, но това не означава, че всичко в пространството от имена е po8ntless или може да се използва само с vb. - person jmoreno; 17.02.2019

If() е най-близкият еквивалент, но внимавайте за косвени преобразувания, които се извършват, ако сте изключили Option Strict

Например, ако не внимавате, може да се изкушите да опитате нещо като:

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

Ще даде на foo стойност 0!

Мисля че '?' еквивалентът на оператор в C# вместо това ще се провали при компилиране

person unnknown    schedule 16.08.2012
comment
Само за пълнота, по-добрият начин да напишете този израз е Dim foo As Integer? = If( someTrueExpression, New Integer?, 2). - person Mark Hurd; 04.02.2015
comment
Имайте предвид, че това се случва и с Option Strict On. Причината е, че Nothing във VB.NET е еквивалентен на default(T) на C#, а не на null. - person Heinzi; 10.12.2015
comment
И за всеки, който е озадачен от Integer?, това означава, че може да бъде нулев - вижте stackoverflow.com/questions/3628757/make-an- integer-null - person AjV Jsy; 17.06.2016
comment
За всеки, който се забива в имплицитно преобразуване за nullable типове - вижте този отговор защо и този отговор за заобиколно решение, което прехвърля аргумента преди връщане (CType(Nothing, DateTime?). - person KyleMit; 17.01.2017

Само за протокола, ето разликата между If и IIf:

IIf(условие, истинска част, невярна част):

  • Това е старата функция VB6/VBA
  • Функцията винаги връща тип обект, така че ако искате да използвате методите или свойствата на избрания обект, трябва да го преобразувате с DirectCast или CType или Convert.* Функции към оригиналния му тип
  • Поради това, ако true-part и false-part са от различни типове, няма значение, резултатът така или иначе е просто обект

Ако(условие, истинска част, невярна част):

  • Това е новата функция на VB.NET
  • Типът резултат е типът на избраната част, истинска част или невярна част
  • Това не работи, ако е включен строг режим и двете части са от различен тип. В строг режим те трябва да са от един и същи тип, в противен случай ще получите изключение
  • Ако наистина трябва да имате две части от различни типове, изключете строгия режим (или използвайте IIf)
  • Досега не съм опитвал дали строг режим позволява обекти от различен тип, но наследени от същата база или прилагащи същия интерфейс. Документацията на Microsoft не е много полезна за този проблем. Може би някой тук го знае.
person Aranxo    schedule 05.12.2020