?:?? Операторы вместо IF | ELSE

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" );
} 

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

Ответ 1

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

Выражение

a ? b : c

оценивает b, если a является истинным и оценивает c, если a является ложным.

Выражение

b ?? c

оценивает b, если b не является нулевым и оценивается как c, если b имеет значение null.

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

return a ? b : c;

или

return b ?? c;

они всегда будут что-то возвращать.

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

Ответ 2

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

Ответ 3

Ссылка на ?: Оператор (ссылка на С#)

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

Ссылка на ?? Оператор (ссылка на С#)

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

Это означает:

[Часть 1]

return source ?? String.Empty;

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

Ответ 4

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

if by//Return Nothing, вы на самом деле означаете return null, а затем напишите

return Source;

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

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

И для последнего

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

// nothing done.

Ответ 5

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

bar ? () : baz();

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

Кроме того, это мало смысла:

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

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

Ответ 6

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

if (Source == value) return;
Source = value;
RaisePropertyChanged("Source");

Ответ 7

the?: является маршрутным оператором. (верю, что я правильно написал), и он прост в использовании. как в булевом предикате? 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; Я считаю, что вы пытаетесь достичь.

Ответ 8

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

Condition-Expression ? Expression1 : Expression2

Найти здесь больше на операторе ?:, также известном как Тернарный оператор:

Ответ 9

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