2011-01-27 6 views
2

Возможно, есть и я не знаю об этом, и если так, я бы с удовольствием хотел быть просветленным. Я хотел бы быть в состоянии использовать что-то похожее на: оператора, но без необходимости включать: и без того, чтобы присвоить результат переменной, например, так:Есть ли более простой способ записи if-утверждений в C#?

q?r(); 

который был бы семантически тождественно

if (q) 
{ 
    r(); 
} 

Редактировать: Я должен был проявить себя яснее. Я ищу способ избавиться от if и else и выразить условное утверждение с более функциональным стилем.

Cheers, /Christian

+0

Для «более кратковременного» чтения «менее разборчиво/легко следовать». –

+0

@middaparka: Итак, по этой логике читаемость линейно возрастает с длиной кода? –

+0

@Adam Robinson Очевидно, что нет (иначе COBOL был бы самым читаемым языком в мире). Я хочу сказать, что после того, как ваш код начнет выглядеть как запись в запутанном кодовом конкурсе, возможно, некоторые проблемы могут стоять впереди на фронте обслуживания. :-) –

ответ

5
if (q) r(); 

Это примерно так же лаконична, как вы можете получить с него.

+2

Нет, вы все равно можете удалить пробелы: 'if (q) r();': D – BoltClock

+0

простой и чистый: P – Spyros

-2

вы также можете использовать: x ?? 0 это нулевая проверка

+2

Вопрос не имеет ничего общего с нулевой проверкой. – BoltClock

1

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

if (q) r(); 

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

Пример:

if (line > 0) builder.AppendLine(); 

в качестве альтернативы:

if (line > 0) { 
    builder.AppendLine(); 
} 
3

Иногда вы можете сохранить писать if заявления с помощью LINQ.

Например, вместо:

int CountItemsLargerThanFive(IEnumerable<int> collection) 
{ 
    int count = 0; 
    foreach (var item in collection) 
    { 
     if (item > 5) 
     { 
     count++; 
     } 
    } 
    return count; 
} 

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

int CountItemsLargerThanFive(IEnumerable<int> collection) 
{ 
    return collection.Count(item => item > 5); 
} 

Нет if «s!

И есть много других случаев, в которых управляющие структуры, такие как if, могут быть заменены LINQ.

1

Как уже упоминалось, придерживайтесь очевидного маршрута.

Для удовольствия, вот способ использовать условный оператор, как вы бы хотели, с делегатами (пожалуйста, не делайте этого):

(q ? (Action)r :() => { })(); 

, который выглядит немного лучше, если бы там были подлинными else:

(q ? (Action)trueAction : falseAction)(); 
Смежные вопросы