?: ?? Операторы вместо IF | ELSE - PullRequest
82 голосов
/ 02 июня 2011
public string Source
{
    get
    {
        /*
        if ( Source == null ){
            return string . Empty;
        } else {
            return Source;
        }
        */
        return Source ?? string.Empty;
    }
    set
    {
        /*
        if ( Source == null ) {
            Source = string . Empty;
        } else {
            if ( Source == value ) {
                Source = Source;
            } else {
                Source = value;
            }
        }
        */
        Source == value ? Source : value ?? string.Empty;
        RaisePropertyChanged ( "Source" );
    }
}

Могу ли я использовать ?: ?? операторов ИМЕННО как If / Else?


Мой вопрос:
Как написать следующее с?: ?? операторы

[1]

if ( Source == null ){
    // Return Nothing
} else {
    return Source;
}

[2]

if ( Source == value ){
    // Do Nothing
} else {
    Source = value;
    RaisePropertyChanged ( "Source" );
} 

Кратко : Как ничего не делать, ничего не возвращать и выполнять несколько инструкций с оператором ?: ???

Ответы [ 9 ]

186 голосов
/ 02 июня 2011

Для [1] вы не можете: эти операторы предназначены для возврата значения, а не для выполнения операций.

Выражение

a ? b : c

оценивается как b, если a равно true и оценивается в c, если a равно false.

Выражение

b ?? c

оценивается как b, если b не равно нулю, и оценивается как c если b равно нулю.

Если вы напишите

return a ? b : c;

или

return b ?? c;

, они всегда вернут что-то.

Для [2] вы можете написать функцию, которая возвращает правильное значение, которое выполняет ваши «множественные операции», но это, вероятно, хуже, чем просто использование if/else.

40 голосов
/ 02 июня 2011

Тернарный оператор (?:) не предназначен для потока управления , он предназначен только для условного присвоения . Если вам нужно контролировать поток вашей программы, используйте управляющую структуру, такую ​​как if / else.

11 голосов
/ 02 июня 2011

Ссылаясь на ?: Оператор (C # Reference)

Условный оператор (? :) возвращает одно из двух значений в зависимости от значение логического выражения. Ниже приводится синтаксис для условный оператор.

Ссылаясь на ?? Оператор (C # Reference)

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

Это значит:

[Часть 1]

return source ?? String.Empty;

[Часть 2] не применимо ...

3 голосов
/ 02 июня 2011

Тернарный оператор ВОЗВРАЩАЕТ одно из двух значений. Или он может выполнить одно из двух утверждений в зависимости от своего состояния, но это, как правило, не очень хорошая идея, поскольку может привести к непреднамеренным побочным эффектам.

bar ? () : baz();

В этом случае () ничего не делает, а baz что-то делает. Но вы только сделали код менее понятным. Я бы пошел за более подробным кодом, который будет понятнее и проще в обслуживании.

Далее, это вообще не имеет никакого смысла:

var foo = bar ? () : baz();

, поскольку () не имеет возвращаемого типа (это void), а baz имеет возвращаемый тип, который неизвестен в точке вызова в этом примере. Если они не согласны, компилятор будет жаловаться и громко.

3 голосов
/ 02 июня 2011

«Ничего не делать» на самом деле не работает?

если под // Возвращать Ничего, что вы на самом деле имеете в виду, вернуть ноль, тогда напишите

return Source;

, если вы имеете в виду, игнорируйте путь к кодузатем напишите

 if ( Source != null )
            {
                return Source;
            }
// source is null so continue on.

и за последние

 if ( Source != value )
            { Source = value;
                RaisePropertyChanged ( "Source" );
            }

// nothing done.
2 голосов
/ 02 июня 2011

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

if (Source == value) return;
Source = value;
RaisePropertyChanged("Source");
1 голос
/ 17 апреля 2013

Оператор ?: возвращает одно из двух значений в зависимости от значения логического выражения.

Condition-Expression ? Expression1 : Expression2

Подробнее об операторе ?:, также известном как троичный оператор:

1 голос
/ 02 июня 2011

?: Это оператор маршрута.(поверьте, я правильно это написал), и он прост в использовании.как в логическом предикате?iftrue: ifalse;Но вы должны иметь rvalue / lvalue, как в rvalue = предикат?iftrue: iffalse;

ex int i = x < 7 ? x : 7;

, если x меньше 7, я получил бы x, если нет, то был бы 7.

, вы также можете использоватьэто в ответ, как в return x < 7 ? x : 7;

снова, как указано выше, это будет иметь тот же эффект.

Итак, Source = Source == value ? Source : string.Empty; Я верю, что это то, что вы пытаетесь достичь.

0 голосов
/ 02 июня 2011

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

...