2010-11-10 2 views
4

Я следующие statments в моем исходном кодеНедостатки использования тройной оператор

int tableField1; 
int tableField2; 

int propertyField1; 
int propertyField2; 

if (tableField1 != null) 
{ 
    propertyField1 = tableField1; 
} 

if (tableField2 != null) 
{ 
    propertyField2 = tableField1; 
} 

// the above pattern is repeated for 10 tablefields ie tableField3, tableField4... tableField10 

я уменьшил выше statments с трехзначным оператором следующим

propertyField1 = tableField1 != null ? tableField1 : propertyField1; 
propertyField2 = tableField2 != null ? tableField2 : propertyField2; 

Ниже приведены мои вопросы:

1) Является тройным оператором неэффективным для использования, чем утверждения if.

2) В чем недостатки (если есть) использовать тернарный оператор.

ответ

11

Почему бы не использовать нулевой коалесцирующий оператор вместо этого?

propertyField1 = tableField1 ?? propertyField1; 

Правда это выглядит слегка нечетное назначая исходное значение обратно в ту же переменную. Вполне возможно, что он будет немного менее эффективным, чем операторы if, так как теоретически вы читаете значение и назначаете его снова ... но я не удивлюсь, если JIT убедится в этом. Во всяком случае, это определенно на уровне микро-оптимизации.

Некоторые люди считают, условный оператор будет плохо для удобочитаемости - Я вообще считаю, что это нормально для простых утверждений, как это, хотя является несколько затеняя смысл «только изменить значение, если у нас есть новый ».

+1

Спасибо, Джон. Я не знал о нулевом объединении. – pradeeptp

0

Насколько я понимаю, тернарный оператор в основном является синтаксическим сахаром, хотя компилятор может его оптимизировать.

В этом случае я считаю, что, вероятно, это будет более эффективно, хотя я бы предположил, что компилятор оптимизирует его, чтобы он был примерно таким же, как оператор if.

Недостатки? В некоторых случаях это может быть труднее прочитать. Это зависит от того, что вы собираетесь делать.

3

1) Нет, компилятор будет обрабатывать тернарный оператор точно так же, как явный оператор if, поэтому нет никакой разницы в эффективности.

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

Я утверждаю, что этот ответ более язык-агностик, чем у Джона Скита :)

+0

Я не согласен с вашей оценкой точки 1. Версия оператора if * only * имеет назначение 'propertyField1', когда' tableField1' равно null. В противном случае значение не изменится. Логически говоря, версия условного оператора * всегда * присваивает 'propertyField1', возможно, после чтения того же поля. Представьте себе, что другой поток возится со значениями - он может назначить новое значение 'propertyField1' * после * чтения, но * перед * присвоением. Тогда эта запись могла бы быть потеряна. Это невозможно в версии 'if'. –

+0

Достаточно честный. Тем не менее, назначение очень дешево, поэтому, если оно не находится в плотном цикле, это не будет иметь большого значения. Я также принял однопоточную систему. Я не утверждаю, что мой ответ более * правильный *, чем ваш :) –

Смежные вопросы