Sobes.tech
Junior

Mis on null-turvalisus (null safety) Dartis?

sobes.tech AI

Vastus AI-lt

Nullturvalisusüsteem on Dartis süsteem, mis aitab vältida jooksva ajal vigu, mis on seotud null-viidete dereferenceerimisega. Kompilaator analüüsib koodi ja määrab, kas muutuja võib hoida null väärtust. Kui muutuja on deklareeritud kui mitte lubav nulli, garantii, et sellele ei määrata kunagi null väärtust.

Nullturvalisuse peamised aspektid:

  • Mitte-null tüüpi: Vaikimisi tüübid ei luba nulli (non-nullable).
    // int ei saa olla null
    int count = 0;
    
  • Nulli lubav tüüp: Selgeks tegemiseks, et muutuja võib olla null, kasutatakse märki ?:
    // String? võib olla null
    String? name;
    
  • ! operaator (null-õigsuse kinnitamine): Kasutatakse väite kinnitamiseks, et nulli lubav avaldis ei ole null. Tuleb kasutada ettevaatusega, kuna nulli korral visatakse erind.
    String? nullableName = 'Flutter';
    // Kasutame !, teades, et nullableName ei ole null
    print(nullableName!.length);
    
  • ? operaator (null-teadlikud operaatorid): Kasutatakse turvaliseks juurdepääsuks liikmetele või meetodite väljakutsetele nulli lubavates avaldistes.
    • ?. (null-teadlik juurdepääs):
      String? nullableString;
      // Kui nullableString ei ole null, kutsutakse length, vastasel juhul tulemus on null
      int? length = nullableString?.length;
      
    • ?? (kui null):
      String? serverName;
      // Kui serverName ei ole null, kasutatakse selle väärtust, vastasel juhul 'Guest'
      String displayName = serverName ?? 'Guest';
      
    • ??= (kui null, määramine):
      String? cache;
      // Kui cache on null, määratakse sellele 'Loading...'
      cache ??= 'Loading...';
      
  • Joo-analüüs (Flow Analysis): Dart'i kompilaator analüüsib koodi ja määrab, millal nulli lubav muutuja on garanteeritult mitte null, võimaldades seda kasutada kui mitte-null.
    String? greeting = getGreeting();
    // Kompilaator teab, et greeting ei ole null pärast seda kontrolli
    if (greeting != null) {
      print(greeting.toUpperCase()); // Võib turvaliselt kasutada toUpperCase()
    }
    

Nullturvalisuse eelised:

  • Vigade vähendamine: Ennetab NullReferenceException (või sarnaseid) jooksva ajal.
  • Lugemise parandamine: Näitab selgelt, kas muutuja võib olla null.
  • Tõhususe suurendamine: Kompilaator võib teha optimeerimisi, teades, millised muutujad on garanteeritult mitte null.

Nullturvalisus võeti kasutusele Dart 2.12 versioonis.