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" );
}
Вкратце : как ничего не делать, ничего не возвращать и выполнять несколько инструкций с ?:
??
оператором?
c#
ternary-operator
Ахмед Гонейм
источник
источник
Ответы:
Для [1] вы не можете: эти операторы предназначены для возврата значения, а не для выполнения операций.
Выражение
оценивается как
b
еслиa
истинно, и оценивается какc
еслиa
ложно.Выражение
оценивается как
b
еслиb
не равно нулю и оценивается какc
еслиb
равно нулю.Если вы напишете
return a ? b : c;
или
return b ?? c;
они всегда что-то вернут.
Для [2] вы можете написать функцию, которая возвращает правильное значение, которое выполняет ваши «множественные операции», но это, вероятно, хуже, чем просто использование
if/else
.источник
Тернарный оператор (
?:
) не предназначен для потока управления , он предназначен только для условного присваивания . Если вам нужно контролировать ход вашей программы, используйте структуру управления, такую какif
/else
.источник
?:
как таковой. Но у меня большая проблема с их использованием для потока управления, особенно вложенного потока управления!Ссылаясь на ?: Оператор (Справочник по C #)
Ссылаясь на ?? Оператор (Справочник по C #)
Это означает:
[Часть 1]
return source ?? String.Empty;
[Часть 2] не применяется ...
источник
«Ничего не делать» действительно не работает?
если // Ничего не вернуть, вы на самом деле имеете в виду return null, тогда напишите
return Source;
если вы имеете в виду, игнорируйте кодовый путь, затем напишите
if ( Source != null ) { return Source; } // source is null so continue on.
И напоследок
if ( Source != value ) { Source = value; RaisePropertyChanged ( "Source" ); } // nothing done.
источник
Тернарный оператор ВОЗВРАЩАЕТ одно из двух значений. Или он может выполнить одно из двух операторов в зависимости от своего состояния, но это обычно не очень хорошая идея, поскольку может привести к непредвиденным побочным эффектам.
В этом случае () ничего не делает, а baz что-то делает. Но вы только сделали код менее понятным. Я бы выбрал более подробный код, более понятный и простой в обслуживании.
Кроме того, в этом нет никакого смысла:
var foo = bar ? () : baz();
Поскольку () не имеет типа возврата (он недействителен), а baz имеет тип возврата, который неизвестен в точке вызова в этом примере. Если они не согласны, компилятор громко пожалуется.
источник
Если вас беспокоит многословность вашего кода, я бы написал это, а не пытался злоупотреблять выражениями.
if (Source == value) return; Source = value; RaisePropertyChanged("Source");
источник
?: оператор маршрута. (полагаю, я правильно написал), и это просто в использовании. как в булевом предикате? iftrue: ifalse; Но у вас должно быть rvalue / lvalue, как в rvalue = predicate? iftrue: если ложно;
бывший
int i = x < 7 ? x : 7;
если бы x было меньше 7, мне было бы назначено x, если бы не было 7.
вы также можете использовать его в качестве возврата, как в
return x < 7 ? x : 7;
опять же, как и выше, это будет иметь тот же эффект.
Итак,
Source = Source == value ? Source : string.Empty;
я считаю, что это то, чего вы пытаетесь добиться.источник
?:
Оператор возвращает одно из двух значений в зависимости от значения логического выражения.Подробнее об
?:
операторе, также известном как тернарный оператор:источник
Я не думаю, что вы можете его оператор и предположить, что он вернет один или другой. Это не замена оператора if else, хотя его можно использовать для этого в определенных случаях.
источник