Od wersji Dart 1.12 operatory obsługujące wartość null są dostępne dla tego typu sytuacji:
bool isConnected(a, b) {
bool outConn = outgoing[a]?.contains(b) ?? false;
bool inConn = incoming[a]?.contains(b) ?? false;
return outConn || inConn;
}
Do ?.
zwarcia operatorowi NULL jeżeli po lewej stronie jest null, a ??
operator zwraca lewej strony, jeśli to nie jest zerowa, a po prawej stronie inaczej.
Twierdzenie
outgoing[a]?.contains(b)
w ten sposób oszacuje, null
czy outgoing[a]
jest null
, lub jako wynik boolowski, contains(b)
jeśli tak nie jest.
Oznacza to, że wynikowa instrukcja będzie jedną z następujących:
bool outConn = null ?? false;
bool outConn = false ?? false;
bool outConn = true ?? false;
To samo dotyczy wartości inConn
logicznej, co oznacza, że oba inConn
i outConn
mają gwarantowaną wartość różną od zera, co pozwala nam zwrócić wynik ||
tych dwóch.
outgoing[a]?.contains(b)
jest niebezpieczne, przynajmniej w przypadku semantyki Groovy'ego, ponieważ kiedyoutgoing
jestnull
, całe wyrażenie ocenia się donull
. Więc w rzeczywistości możesz dostać coś takiegoreturn (null || true)
, co wrzuci tryb zaznaczenia.??
Do mojej zaktualizowanej odpowiedzi włączyłem operator łączenia zerowego ( ), aby uwzględnić ten problem.object?.field ?? true
. Gdzie prawda może być czymkolwiek zechcesz.Istnieją teraz 4 operatory świadome wartości zerowej
?? zapewnia wartość domyślną, jeśli temat ma wartość null
return subject ?? "defaultIfNull";
?? = ustawia temat na domyślny tylko wtedy, gdy jest on pusty
To jest podobne do ?? ale ustawia zmienną podmiotu na wartość domyślną, jeśli jest pusta.
subject ??= "defaultIfNull";
? unikaj wyjątku, jeśli podmiot jest pusty podczas uzyskiwania dostępu do właściwości podmiotu
object?.x
zwróci wartość null, jeśli obiekt ma wartość null,object.x
spowoduje wyjątek, jeśli obiekt będzie miał wartość null...? z kolekcji rozłożonych, unikaj pustego elementu na ostatecznej liście, jeśli lista tematów jest pusta
wynik następujących czynności
[ ...[1, 2], null, ]
jest
[1, 2, null]
aby uniknąć wartości null użyj ...?
var resultingList = [ ...[1, 2], ...?subjectList, ];
źródło
a
ma metodę voidmethod()
, następująca składniaa?.method();
wykona metodę tylko wtedy, gdya
nie jest null.if(a!=null){XYZ();}
Publikując następujące polecenie, ponieważ znalazłem się tutaj, szukając tytułu.
Jak na https://github.com/dart-lang/sdk/issues/66 , wydaje się, że odpowiedź na pytanie „Co to jest idiom lub najlepsza praktyka sprawdzania wartości zerowej Dart?” jest:
W ogólnym przypadku nie ma idiomu sprawdzania wartości zerowej ani najlepszych praktyk. Jeśli operatory obsługujące wartość null nie pasują do twojego przypadku, użyj bezpośredniego porównania, jak w
if (object == null)
lubif (object != null)
.źródło
bool ok<T>(T obj) => obj != null; bool nul<T>(T obj) => obj == null;
źródło