Что такое 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

Я знаю, что другие ответили на это... но я думал, что уточню. Если вам интересно больше читать, он называется тернарный оператор или также известен как условный оператор.

Ответ 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