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á null
si 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 inConn
booleano, lo que significa que ambos inConn
y outConn
está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 cuandooutgoing
esnull
, 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?.x
devolverá nulo si el objeto es nulo,object.x
causarí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
a
tiene un método voidmethod()
, la siguiente sintaxisa?.method();
ejecutará el método solo sia
no 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