【问题标题】:Dart Null Safety Concept is not clearedDart Null 安全概念未清除
【发布时间】:2021-09-07 07:47:52
【问题描述】:

Dart 空安全表示默认情况下所有原始数据类型(int、String、bool)的变量都是不可为空的,它们不能有空值,对吧?假设如果我有一个 int 类型的变量“a”,那么除非使用带有数据类型的问号,否则我不能为其分配空值。

int a=null;

上面的代码会产生一个错误,比如'值'null'不能分配给'int'类型的变量,因为'int'不可为空。'

但同时,dart 表示所有初始化的变量都有一个默认值 null。我的问题是为什么 statement-1 与 statement-2 不匹配? Dart 不应该允许我们声明一个未初始化的变量,因为未初始化的变量包含空值,它不适用于它自己的语句。有人能解开我的困惑吗?

【问题讨论】:

  • "默认情况下所有原始数据类型的变量..." Dart 没有“原始数据类型”。所有以? 结尾的类型都可以为空,所有不带dynamic 的类型都不能为空(dynamic 除外,这是特殊的)。 “但与此同时,dart 说所有初始化的变量都有一个默认值 null。”谁说?无论您在哪里阅读,它都可能是从零安全性之前写入的过时信息。这种说法不再正确。
  • 同意。它可能应该是“所有un初始化变量”。使用 null 安全性,未初始化的 nullable 变量的默认值为 null。具有潜在不可空类型的未初始化变量只是 未初始化 并且必须在读取之前明确分配(或者如果变量为 late 则可能仅分配,如果您使用运行时错误在实际初始化之前阅读它)。
  • @jamesdlin 非常感谢您消除了我的困惑,我刚刚再次阅读了 dart 文档,这是我的错误 dart 说Uninitialized variables that have a nullable type have an initial value of null。它适用于可空类型变量,但我认为它是不可为空的。

标签: dart dart-null-safety


【解决方案1】:

如果你像这样声明变量

int? a = null; 
int? a;

两者都将为空;

当您输入“?”时在变量之后,您对 dart 说“嘿,不管它是否为空,我都可以” 但有时如果传递给它的变量为空,您将不会执行某些函数,因此您必须声明一个不带“?”的变量在这种情况下,您要说“嘿,这个变量不能为空”;

另外,你必须对空检查器进行研究,因为它非常重要

?, !, ?? 空检查器

我会保持非常简单

?说如果值为null就可以了

!说它必须有非空值

??说如果它是 null 然后分配另一个值...

    String? nullableValue;

String nonNullableValue;
nonNullableValue = nullableValue; //throws error because nullable value cants be assigned to non nullable variable;

nonNullableValue = nullableValue ?? "undefined or null"// You are saying to dart "hey if nullable value null then assign "undefined or null";

nonNullableValue = nullableValue! // You are saying to dart "Hey this value Must not be null . But you have to check value for null with if condition like this

if(nullableValue !=null) {
nonNullableValue = nullableValue!;// By putting ! you are saying "don't worry dart this is checked value and its 100% not null";
}

null 安全的主要原因是检查或防止变量为 null

请阅读官方docs了解更多信息

【讨论】:

  • 非常感谢您的精彩解释,但我不想对此进行解释,我的观点是“int nonNullable;”我们不能给这个变量赋空值,对吧?但同时,这个变量有一个空值,因为所有未初始化的变量都有一个默认的空值。这个冲突让我很困惑
  • @MuhammadAfzal int nonNullable 永远不会获得空值。即使您没有为其 dart 编译器分配默认值,也会说“嘿,未分配 nonNullableValue 变量,所以我试图给它一个空值,但这种类型的变量不允许给它空值,但是你什么时候放?在变量之后,你说这个变量被允许获得一个空值,所以如果它没有被初始化,飞镖将分配一个空值”
  • 我刚刚再次阅读了 dart 文档并找到了这个声明 Uninitialized variables that have a nullable type have an initial value of null,我找到了解决方案,这是我的错误,实际上我弄错了,dart 说只有 nullable 类型有一个默认值 null 但我虽然每个未初始化的变量都有一个默认值 null 这是错误的。
猜你喜欢
  • 1970-01-01
  • 2011-07-02
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多