Ассоциативность тернарного оператора в C# - я могу полагаться на него?

Этот бумага проекта кода имеет строковую функцию подобия использование расстояние Левенштейна .

17
задан Vilx- 19 November 2009 в 14:24
поделиться

4 ответа

Да, вы можете положиться на это (не только в C #, но и во всех (насколько мне известно)) других языках ( кроме PHP … иди рисунок) с условным оператором), и ваш вариант использования на самом деле является довольно распространенной практикой, хотя некоторые люди ее ненавидят.

Соответствующий раздел в ECMA-334 (стандарт C #) - 14.13 § 3:

Условный оператор является правоассоциативным, что означает, что операции группируются справа налево. [Пример: выражение формы a? До нашей эры ? d: e оценивается как a? b: (c? d: e) . конец пример]

22
ответ дан 30 November 2019 в 11:04
поделиться

См. Msdn: http://msdn.microsoft.com/en-us/library/ty67wk28%28VS.80%29.aspx

«Если условие истинно, первое выражение вычисляется и становится результатом; если ложно, второе выражение вычисляется и становится результатом. Когда-либо вычисляется только одно из двух выражений "

1
ответ дан 30 November 2019 в 11:04
поделиться

Если вам нужно спрашивать, не спрашивайте. Любой, кто читает ваш код, просто должен будет проходить тот же процесс, что и вы, снова и снова, каждый раз, когда необходимо просмотреть код. Отлаживать такой код неинтересно. В конце концов, все равно будет изменено использование круглых скобок.

Re: «Попытайтесь написать все это СО скобками».

result = (obj1.Prop1 != obj2.Prop1 ? obj1.Prop1.CompareTo(obj2.Prop1) :
         (obj1.Prop2 != obj2.Prop2 ? obj1.Prop2.CompareTo(obj2.Prop2) :
         (obj1.Prop3 != obj2.Prop3 ? obj1.Prop3.CompareTo(obj2.Prop3) :
                                     obj1.Prop4.CompareTo(obj2.Prop4))))

Уточнение:

  • «Если вы должны спрашивайте, не надо »
  • « Любой, кто читает ваш код ... »

Соблюдение общепринятых в проекте соглашений - это то, как вы поддерживаете согласованность, что улучшает читаемость. Было бы глупо думать, что вы можете писать код, доступный для чтения всем, включая тех, кто даже не знает языка!

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

Тем не менее, если использование тернарных выражений без круглых скобок является общепринятым соглашением в вашем проекте, тогда используйте его. , во всех смыслах! То, что вам нужно было спросить, указывает на то, что это не принято и не принято в вашем проекте. Если вы хотите изменить условные обозначения в своем проекте, сделайте очевидное однозначное, отметьте это как что-то для обсуждения с другими участниками проекта и двигайтесь дальше. Здесь это означает использование круглых скобок или использование if-else.

И последнее, о чем стоит подумать, если какой-то код кажется вам умным:

Отладка вдвое сложнее, чем написание кода в первую очередь. Следовательно, если вы напишете код настолько умно, насколько это возможно, вы по определению недостаточно умны, чтобы отлаживать его. - Брайан В. Керниган

17
ответ дан 30 November 2019 в 11:04
поделиться

Утверждение о том, что скобки ухудшают читабельность кода, является ложным. Я нахожу выражение в скобках более ясным. Лично я бы использовал круглые скобки и / или переформатировал несколько строк, чтобы улучшить читаемость. Переформатирование нескольких строк и использование отступов может даже устранить необходимость в скобках. И да, вы можете полагаться на тот факт, что порядок ассоциации детерминирован, справа налево. Это позволяет выражению вычисляться слева направо ожидаемым образом.

obj1.Prop1 != obj2.Prop1
     ? obj1.Prop1.CompareTo(obj2.Prop1)
     : obj1.Prop2 != obj2.Prop2
           ? obj1.Prop2.CompareTo(obj2.Prop2)
           : obj1.Prop3 != obj2.Prop3
                  ? obj1.Prop3.CompareTo(obj2.Prop3)
                  : obj1.Prop4.CompareTo(obj2.Prop4);
4
ответ дан 30 November 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: