Sobes.tech
Junior

Ի՞նչ է null անվտանգությունը (null safety) in Dart?

sobes.tech AI

Պատասխան AI-ից

Նուլային անվտանգությունը համակարգ է Dart-ում, որը օգնում է կանխել ժամանակի ընթացքում սխալները, կապված null-հղման հետ։ Կոմպիլատորը վերլուծում է կոդը և որոշում, արդյոք փոփոխականը կարող է պարունակել null արժեք։ Եթե փոփոխականը հայտարարված է որպես null-չհամատեղելի, կոմպիլատորը երաշխավորում է, որ նրան երբեք չի տրվի null արժեք։

Նուլային անվտանգության հիմնական կողմերը՝

  • Անհայտ ոչ-null տիպ: Դեֆոլտով տիպերը թույլ չեն տալիս null (non-nullable):
    // int չի կարող լինել null
    int count = 0;
    
  • Null-թույլատրող տիպ: Բացահայտելու համար, որ փոփոխականը կարող է լինել null, օգտագործվում է նշանը ?:
    // String? կարող է լինել null
    String? name;
    
  • ! օպերատոր (non-null հաստատում): Օգտագործվում է հաստատելու, որ null-թույլատրող արտահայտությունը չի հանդիսանում null։ Պետք է օգտագործել զգուշությամբ, քանի որ null- ի դեպքում նետվում է արտակարգ իրավիճակ։
    String? nullableName = 'Flutter';
    // Օգտագործում ենք `!`, իմանալով, որ nullableName չի null
    print(nullableName!.length);
    
  • ? օպերատոր (null-համատեղելի օպերատորներ): Օգտագործվում է անվտանգ մուտք գործելու համար անդամների կամ մեթոդների կանչերի վրա null-թույլատրող արտահայտությունների։
    • ?. (null-համատեղելի մուտք):
      String? nullableString;
      // Եթե nullableString չի null, կկոչվի length, հակառակ դեպքում արդյունքը կլինի null
      int? length = nullableString?.length;
      
    • ?? (եթե null):
      String? serverName;
      // Եթե serverName չի null, օգտագործվում է նրա արժեքը, հակառակ դեպքում՝ 'Guest'
      String displayName = serverName ?? 'Guest';
      
    • ??= (եթե null, նշանակել).:
      String? cache;
      // Եթե cache null է, նրան նշանակվում է 'Loading...'
      cache ??= 'Loading...';
      
  • Աղյուսակային վերլուծություն (Flow Analysis): Dart-ի կոմպիլատորը վերլուծում է կոդը և որոշում, երբ null-թույլատրող փոփոխականը հաստատապես չի հանդիսանում null՝ թույլ տալով օգտագործել այն որպես ոչ-null։
    String? greeting = getGreeting();
    // Կոմպիլատորը գիտի, որ greeting-ը չի null այս ստուգումից հետո
    if (greeting != null) {
      print(greeting.toUpperCase()); // Անվտանգ է օգտագործել toUpperCase()
    }
    

Նուլային անվտանգության առավելությունները՝

  • Համակողմանի սխալների նվազեցում: Պրոֆիլակտիկորեն կանխում է NullReferenceException (կամ նմանատիպ) ժամանակի ընթացքում։
  • Կարդալության բարելավում: Բացահայտում է, կարող է արդյոք փոփոխականը լինել null։
  • Ավելի բարձր արդյունավետություն: Կոմպիլատորը կարող է կատարել օպտիմիզացիաներ՝ իմանալով, թե որոնք փոփոխականները հաստատապես չեն null։

Նուլային անվտանգությունը ներդրվել է Dart 2.12-ում։