2012-01-21 4 views
6

У меня есть функция с кратному, если (в ЭТО НЕ АКТУАЛЬНО КОД)C#: Expression

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

Вместо того, что я хотел сделать, сделать их всех в: выражение:

(n == 1) ? m = 1; 

Но он говорит, что его ожидали «:»

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

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

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

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

+5

Почему бы не 'm = n'? – Pubby

+0

Да, Google трудно помечать вопросительный знак. Это называется тернарным оператором. – DOK

+8

Оператор if if выполняет оператор, если условие выполнено *. Условное выражение * выбирает выражение для оценки, если условие выполнено *, а в C# оно должно что-то делать с этим выражением *. (В отличие от C++, где выражение может быть выполнено для его побочных эффектов.) Вы смешиваете два стиля вместе странным образом; не делайте этого. Это обычно невозможно, и когда это возможно, это очень запутанно. Используйте переключатель или if-else; это гораздо более удобочитаемо. –

ответ

2

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

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

var m = n == 1 ? 1 : 0 
+2

Условный оператор '?:' Является тройным оператором, поскольку он принимает три параметра. Я бы не назвал это * тройным оператором, даже если у C# в настоящее время есть только один из них. – CodesInChaos

+1

Я думаю, что это должен быть комментарий. – CodesInChaos

+0

Предлагаю * тернарный условный оператор *. – Pubby

14

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

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

Что вы могли бы затем каскадом:

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

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

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

+0

Ничего себе, я не понимал, что вы можете связать их вместе. – DOK

+7

@ DOK - вы можете, не означает, что он делает что-то иное, кроме ужасно нечитаемого кода! ; =) – Rob

+0

@Rob [Это не обязательно] (http://pastebin.com/0kHXD1Hd). Не уверен, что C# имеет '# define', но это то, что я делаю в C/C++. – Pubby

1

Вы могли бы написать:

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

Но IMO, что труднее читать и уродливее, чем исходный код.

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

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

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

1

Вы хотите:

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

Чтобы вложить их все это будет выглядеть следующим образом:

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

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

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

Средства

М равен 1, если п == 1, то м

FYI ? называется оператором Ternery. Найти Usage on MSDN

С наилучшими пожеланиями,

2

Может быть:

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

или

m = n 

Ed это: Упрощенная:

variable2 = (variable1 == value) ? 
      variable1 : 
      variable2; 
+0

+1 для 'm = n'. Оптимизированный код; P –

+0

Серьезно? Это пример – user779444

+0

@ user779444 Не очень хороший пример. И это довольно легко понять, как это сделать из моего ответа. –

0

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

Если вы хотите транслитерации, если заявление в:, то это довольно просто:

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

становится

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

Единственным ограничением является то, что код then/else является одним утверждением.

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

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