C #?: Выражение - PullRequest
       10

C #?: Выражение

6 голосов
/ 21 января 2012

У меня есть функция с несколькими if ( ЭТО НЕ ФАКТИЧЕСКИЙ КОД )

if(n == 1)
   m = 1;
if(n == 2)
   m = 2;
if(n == 3)
   m = 3;

Вместо этого я хотел сделать их всех в?: Expression:

(n == 1) ? m = 1;

Но он говорит, что ожидал ':'

Я знаком с выражением?: Из C ++, где вы можете просто написать:

(n == 1) ? m = 1 : 0;

Но 0 здесь не берется. Это нелепый вопрос, и я даже не смог найти ответ в Google, так как он игнорирует слово «?:».

ОТВЕТ : жаль, что ответ был в комментариях. В этом выражении нет способа «ничего не делать», и я должен использовать if-else или switch. спасибо.

Ответы [ 8 ]

14 голосов
/ 21 января 2012

Похоже, вы ищете:

m = (n == 1) ? 1 : 0;

К которым вы могли бы затем обратиться:

m = (n == 1) ? 1 : (n == 2) ? 2 : (n == 3) ? 3 : 0;

Важное (для меня, во всяком случае), кроме:

Почему вы спрашиваете это? Если это потому, что вы думаете, что эта форма будет более эффективной, чем ряд if утверждений или switch, не . Компилятор C # и компилятор .net JIT действительно очень умны, и они преобразуют ваш код (надеюсь!) В его наиболее оптимальную форму. Напишите свой код так, чтобы он был понятен вам самим или разработчику, который должен поддерживать его после вас , насколько это возможно. Если производительность, которую вы получаете, неприемлема, попробуйте изменить ее, но измерьте , чтобы определить, что работает лучше всего (учитывая, что новые компиляторы / .net каркасы вполне могут изменить то, что происходит).

2 голосов
/ 21 января 2012

Может быть:

m = (n == 1) ? 1 : (n == 2) ? 2 : (n == 3) ? 3 : m;

или

m = n

Edit: Упрощенный:

variable2 = (variable1 == value) ?
             variable1 :
             variable2;
2 голосов
/ 21 января 2012

ищет троичный оператор в c # даст вам соответствующие результаты.

пример использования будет

var m = n == 1 ? 1 : 0
1 голос
/ 21 января 2012
m = (n == 1) ? 1 : m

Значит

M равно 1, если n == 1, иначе m

FYI ? называется оператором Тернери.Найти использование на MSDN

С уважением,

1 голос
/ 21 января 2012

Вы хотите это:

m = (n == 1) ? 1 : 0;

Чтобы вкладывать их все, это будет выглядеть так:можно увидеть, что это действительно не так легко читать и понимать.Это может помочь добавить дополнительные скобки, но я думаю, что вам лучше использовать дерево if-else.

1 голос
/ 21 января 2012

Вы можете написать:

m = (n==1) ? 1 : m;

Но ИМО сложнее для чтения и страшнее оригинального кода.

(n == 1) ? m = 1 : 0;

Это запрещено, потому что C # не допускает произвольных выражений в качестве оператора. Вызовы методов и назначения разрешены, большинство других выражений - нет.

Оператор выполняется для его побочных эффектов, выражение для его значения. Поэтому вполне естественно, что внешняя часть утверждения имеет побочный эффект. ?: никогда не имеет побочного эффекта, поэтому не допускается в качестве утверждения.

0 голосов
/ 21 января 2012

Эту проблему не нужно решать с помощью троичного оператора if / else - это, безусловно, идеальный кандидат для оператора switch (и использование переключателя, вероятно, будет гораздо более эффективным, чем использование последовательности троичных операторов)

Если вы хотите транслитерировать оператор if в?:, Тогда все довольно просто:

if ({condition}) {then-code}; else {else-code};

становится

{condition} ? {then-code} : {else-code};

Единственное ограничение заключается в том, что код then / else является одним оператором.

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

0 голосов
/ 21 января 2012

Попробуйте это:

m = (n == 1) ? 1 : 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...