What is the Dart null checking idiom or best practice?

前端 未结 4 2115
天命终不由人
天命终不由人 2020-12-04 15:25

I have the following form of assignment & null checks to avoid double lookups in my maps.
Is there a better or more idiomatic way to do this in Dart?



        
相关标签:
4条回答
  • 2020-12-04 15:47

    Posting the following, as I ended up here by searching the title.

    As per https://github.com/dart-lang/sdk/issues/66, it seems that the answer to "What is the Dart null checking idiom or best practice?" is:

    There is no null checking idiom or best practice in the general case. If null-aware operators don't fit your case use direct comparison as in if (object == null) or if (object != null).

    0 讨论(0)
  • 2020-12-04 15:52

    As of Dart 1.12 null-aware operators are available for this type of situation:

    bool isConnected(a, b) {
      bool outConn = outgoing[a]?.contains(b) ?? false;
      bool inConn = incoming[a]?.contains(b) ?? false;
      return outConn || inConn;
    }
    

    The ?. operator short-circuits to null if the left-hand side is null, and the ?? operator returns the left-hand side if it is not null, and the right-hand side otherwise.

    The statement

    outgoing[a]?.contains(b)
    

    will thus either evaluate to null if outgoing[a] is null, or the boolean result of contains(b) if it is not.

    That means the resulting statement will be one of the following:

    bool outConn = null ?? false; // false
    bool outConn = false ?? false; // false
    bool outConn = true ?? false; // true
    

    The same applies to the inConn boolean, which means both inConn and outConn are guaranteed to be non-null, allowing us to return the result of ||ing the two.

    0 讨论(0)
  • 2020-12-04 15:53
    bool ok<T>(T obj) => obj != null;
    bool nul<T>(T obj) => obj == null;
    
    0 讨论(0)
  • 2020-12-04 15:54

    There are now 4 null aware operators

    ??     provides a default if the subject is null

    return subject ?? "defaultIfNull";
    

    ??=     sets the subject to a default only if the subject is null

    This is similar to ?? but sets the subject variable to a default if it is null.

    subject ??= "defaultIfNull";
    

    ?.     avoid an exception if subject is null when accessing subject's property

    object?.x will return null if object is null, object.x would cause an exception if object were null

    ...?     from a spread collection, avoid a null item in the final list if the subject list is null

    the result of the following

    [
      ...[1, 2],
      null,
    ]
    

    is [1, 2, null]

    to avoid the null value use ...?

    var resultingList = [
      ...[1, 2],
      ...?subjectList,
    ];
    
    0 讨论(0)
提交回复
热议问题