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