Что такое IIF в С#?
Возможный дубликат:
iif эквивалент в С#
У меня есть несколько строк кода, использующих IIf
в VB, и я пытаюсь преобразовать этот код в С#.
Вот пример, где мне нужна помощь:
intCurrency = IIf(or.Fields("Currency").Value = "USD", 100, 0)
Как изменить приведенную выше строку кода на С#? Есть ли в С# оператор оценки короткого замыкания?
Ответы
Ответ 1
Это закрыть для термального/условного оператора С#, как предполагалось несколькими людьми, но это не точная замена. Терминальный оператор С# выполняет оценку короткого замыкания, означающую, что происходит только побочный эффект оцененного предложения. В VB.Net функция Iif
не реализует короткое замыкание и будет оценивать оба побочных эффекта.
Кроме того, функция Iif
в VB.Net слабо типизирована. Он принимает и возвращает значения, введенные как Object
. Тройной оператор С# строго типизирован.
Ближайшим эквивалентом, который вы можете написать, является следующее. Ввод значений в аргументы заставляет оценить их побочные эффекты.
public static object Iif(bool cond, object left, object right) {
return cond ? left : right;
}
Или несколько более удобный
public static T Iif<T>(bool cond, T left, T right) {
return cond ? left : right;
}
Ответ 2
Да, это вопросительный знак (A.K.A условный оператор ).
intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;
Ответ 3
Это невероятно педантичный, но ближайший эквивалент IIf
в С# -
intCurrency = ((Func<bool, object, object, object>)((x, y, z) => x ? y : z))(or.Fields["Currency"].Value == "USD", 100, 0);
Однако, интересно, действительно ли вы заинтересованы в тройном операторе VB. Итак, в VB
intCurrency = IIf(or.Fields("Currency").Value = "USD", 100, 0)
лучше писать (обратите внимание на разницу между IIf
и If
)
intCurrency = If(or.Fields("Currency").Value = "USD", 100, 0)
который является тем же самым в С#, что и
intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;
Еще один интересный момент состоит в том, что If
удваивается как нулевой коалесцирующий оператор.
Dim text As String = Nothing
text = If(text, "Nothing")
который является тем же самым в С#, что и
string text = null;
text = text ?? "null";
Ответ 4
Я знаю, что другие ответили на это... но я думал, что уточню. Если вам интересно больше читать, он называется тернарный оператор или также известен как условный оператор.
Ответ 5
Это оператор?:.
or.Fields["Currency"].Value == "USD" ? 100 : 0;
http://msdn.microsoft.com/en-us/library/ty67wk28.aspx
Ответ 6
intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;
Ответ 7
Вы можете использовать оператор?: для выполнения эквивалентного кода:
intCurrency = or.Fields["Currency"].Value = "USD" ? 100 : 0;
Ответ 8
Как утверждали другие, вы ищете условный оператор :
intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;
Однако, как точка коррекции, это не "оценка короткого замыкания". Оценка короткого замыкания означает, что после того, как логическое выражение может быть надежно определено, дальнейшая оценка не выполняется (это связано с условием true
в выражении or
или false
в выражении and
).
В то время как возможно комбинировать булевы выражения в условном операторе так же, как вы можете в чем-либо еще (например, в выражении if
), и это выражение использует краткосрочную оценку, ему нечего делать сам по себе, с условным оператором.
Важным отличием является то, что, хотя функция VB.NET Iif
оценивает как истинные, так и ложные выражения, условный оператор С# оценивает только выражение, которое выбирается логическим условием (делая его более похожим на традиционное if
). Это может быть важно, если код VB.NET полагался на оба оцениваемых выражения.
Ответ 9
or.Fields( "Валюта" ). Значение = "USD"? 100: 0