A partir de Dart 1.12, los operadores con reconocimiento de nulos están disponibles para este tipo de situación:
bool isConnected(a, b) {
bool outConn = outgoing[a]?.contains(b) ?? false;
bool inConn = incoming[a]?.contains(b) ?? false;
return outConn || inConn;
}
El ?.operador cortocircuita a nulo si el lado izquierdo es nulo, y el ??operador devuelve el lado izquierdo si no es nulo y el lado derecho en caso contrario.
La declaración
outgoing[a]?.contains(b)
por lo tanto, evaluará nullsi outgoing[a]es null, o el resultado booleano de contains(b)si no es.
Eso significa que la declaración resultante será una de las siguientes:
bool outConn = null ?? false;
bool outConn = false ?? false;
bool outConn = true ?? false;
Lo mismo se aplica al inConnbooleano, lo que significa que ambos inConny outConnestán garantizados como no nulos, lo que nos permite devolver el resultado de ||los dos.
outgoing[a]?.contains(b)es peligroso, al menos con la semántica Groovy, porque cuandooutgoingesnull, toda la expresión se evalúa comonull. Entonces, de hecho, podría obtener algo comoreturn (null || true), que se lanzará en modo verificado.??) en mi respuesta actualizada para dar cuenta de ese problema.object?.field ?? true. Donde verdadero puede ser lo que quieras.Ahora hay 4 operadores con conocimiento nulo
?? proporciona un valor predeterminado si el asunto es nulo
return subject ?? "defaultIfNull";?? = establece el asunto en un valor predeterminado solo si el asunto es nulo
Esto es similar a ?? pero establece la variable sujeto a un valor predeterminado si es nulo.
subject ??= "defaultIfNull";?. evitar una excepción si el sujeto es nulo al acceder a la propiedad del sujeto
object?.xdevolverá nulo si el objeto es nulo,object.xcausaría una excepción si el objeto fuera nulo...? de una colección extendida, evite un elemento nulo en la lista final si la lista de temas es nula
el resultado de lo siguiente
[ ...[1, 2], null, ]es
[1, 2, null]para evitar el uso de valor nulo ...?
var resultingList = [ ...[1, 2], ...?subjectList, ];fuente
atiene un método voidmethod(), la siguiente sintaxisa?.method();ejecutará el método solo siano es nulo.if(a!=null){XYZ();}Publicando lo siguiente, ya que terminé aquí buscando el título.
Según https://github.com/dart-lang/sdk/issues/66 , parece que la respuesta a "¿Cuál es el idioma de verificación nula de Dart o la mejor práctica?" es:
No hay ningún idioma de verificación nulo o mejores prácticas en el caso general. Si los operadores con reconocimiento de nulos no se ajustan a su caso, utilice la comparación directa como en
if (object == null)oif (object != null).fuente
bool ok<T>(T obj) => obj != null; bool nul<T>(T obj) => obj == null;fuente