Тройной оператор одиночного вызова - PullRequest
20 голосов
/ 04 февраля 2011

.NET теперь поддерживает оператор объединения нулей

var item = aVal ?? aDefaultVal; 

Возможно, я упускаю что-то очевидное, но есть ли что-то похожее для троичного оператора, такое, что вместо выполнения

var item = aclass.amethod() > 5 ? aclass.amethod() : 5; 

не будет необходимости звонить amethod() дважды?

Ответы [ 3 ]

28 голосов
/ 05 февраля 2011
var item = Math.Max(5, aclass.amethod());
26 голосов
/ 05 февраля 2011

Как насчет:

var result = aclass.amethod();
var item = result > 5 ? result : 5;

Вам нужно позвонить aclass.amethod() только один раз, затем.

12 голосов
/ 05 февраля 2011

Нет такого оператора, встроенного в C #.

Хотя я бы выбрал один из других ответов (тот, который использует Math.Max, возможно, болееясно для приведенного примера), это здесь, чтобы показать другой метод.Жаль, что вычисления требуют явно типизированной переменной.

Func<int,int> computation = (x) => x > 5 ? x : 5;
var item = computation(aclass.amethod());

И in-line, что просто ужасно в C #.

var item = ((Func<int,int>)((x) => x > 5 ? x : 5))(aclass.amethod());

Конечно, оба вышеперечисленных действительносводиться к следующему:

var item = DoComputation(aclass.amethod());

И использовать тот факт, что C # не использует передачу по имени: -)

Или, возможно, метод расширения:

static class Ext {
  public static TO Apply<TI,TO> (this TI obj, Func<TI,TO> fn) {
    return fn(obj);
  }
}

// note C# now lets us get away with no explicit Func<...> type
var item = Ext.Apply(aclass.amethod(), x => x > 5 ? x : 5);

// or as extension method -- imagine computation is as it was in the
// first example, or a compatible method group
var item = aclass.amethod().Apply(computation);

Удачного кодирования.

...