栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

什么是Dart中的Null安全性?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

什么是Dart中的Null安全性?

空安全性/不可为空(默认)

当前可以在nullsafety.dartpad.dev中找到null安全/不可为空(默认情况下)的简短NNBD功能。
请记住,您可以在此处阅读完整的规格和此处的完整路线图。现在,Dart的声音无效安全性也已正式宣布。


默认情况下,不可为空是什么意思?

void main() {  String word;  print(word); // illegal  word = 'Hello, ';  print(word); // legal}

正如您在上面看到的, _ 默认情况下 变量是 _不可为空的 ,这 意味着通常声明的每个变量 都不能

null
。因此,在赋值之前访问变量的任何操作都是非法的。
此外,
null
也不允许分配给非空变量:

void main() {  String word;  word = null; // forbidden  world = 'World!'; // allowed}

这对我有什么帮助?

如果变量是 不可为空的 ,则可以确保它永远不会 为空

null
。因此,您无需事先检查。

int number = 4;void main() {  if (number == null) return; // redundant  int sum = number + 2; // allowed because number is also non-nullable}

记得

如果类中的实例字段不可为空,则 必须对其进行初始化

class Foo {  String word; // forbidden  String sentence = 'Hello, World!'; // allowed}

请参阅

late
下文以修改此行为。

可空类型(
?

您可以通过将问号附加到变量类型来使用 可为空的类型

?

class Foo {  String word; // forbidden  String? sentence; // allowed}

一个 可空 变量不需要初始化,然后才能使用它。

null
默认情况下初始化为:

void main() {  String? word;  print(word); // prints null}

!

如果为null,则追加

!
到任何变量
e
将引发 运行时错误
e
,否则将其转换为 不可为null的
v

void main() {  int? e = 5;  int v = e!; // v is non-nullable; would throw an error if e were null  String? word;  print(word!); // throws runtime error if word is null  print(null!); // throws runtime error}

late

关键字

late
可用于标记 稍后初始化的 变量,即不是在声明它们时而是在访问它们时。这也意味着我们可以拥有稍后初始化的非空
实例字段

class ExampleState extends State {  late final String word; // non-nullable  @override  void initState() {    super.initState();    // print(word) here would throw a runtime error    word = 'Hello';  }}

word
在初始化之前进行访问将引发运行时错误。

late final

现在也可以将最终变量标记为较晚:

late final int x = heavyComputation();

heavyComputation
一旦
x
被访问,这里将仅被调用。此外,您还可以声明一个
latefinal
没有初始化程序的a,它与仅具有一个
late
变量相同,但是只能被分配一次。

late final int x;// w/ex = 5; // allowedx = 6; // forbidden

请注意,无论是否使用,现在都将对具有初始化程序的所有 顶级静态 变量进行求值。

late``final

required

以前是 注释

@required
),现在已作为修饰符内置。它允许将任何命名的参数(对于函数或类)标记为
required
,这使它们不可为空:

void allowed({required String word}) => null;

这也意味着,如果参数不能 为null ,则需要将其标记为

required
或具有默认值:

void allowed({String word = 'World'}) => null;void forbidden({int x}) // compile-time error because x can be null (unassigned)    =>    null;

任何其他命名参数必须可以为

void baz({int? x}) => null;

?[]

?[]
为索引运算符添加了空感知运算符
[]

void main() {  List<int>? list = [1, 2, 3];  int? x = list?[0]; // 1}

另请参阅有关语法决定的本文。

?..

现在,级联运算符还具有一个新的空值感知运算符:

?..

它导致仅当接收者 不为null时 ,才执行以下级联操作。因此,

?..
必须是级联序列中的第一个级联运算符:

void main() {  Path? path;  // Will not do anything if path is null.  path    ?..moveTo(3, 4)    ..lineTo(4, 3);  // This is a noop.  (null as List)    ?..add(4)    ..add(2)    ..add(0);}

Never

为避免混淆:开发人员不必担心这一点。为了完整起见,我想提到它。

Never
的类型将类似于中定义的先前存在
Null
不存在
null
)的类型
dart:core
。这两个类都不能扩展,实现或混入,因此不打算使用它们。

本质上,这

Never
意味着不允许任何类型,并且
Never
不能实例化其本身。
不过
Never
List<Never>
满足名单,这也就意味着泛型类型约束 必须是 空的
List<Null>
但是,可以包含
null

// only valid state: []final neverList = <Never>[  // Any value but Never here will be an error.  5, // error  null, // error  Never, // not a value (compile-time error)];// Can contain null: [null]final nullList = <Null>[  // Any value but Null will be an error.  5, // error  null, // allowed  Never, // not a value (compile-time error)  Null, // not a value (compile-time error)];

示例:编译器将推断

List<Never>
empty
const List<T>

Never
就我而言,不应被程序员使用。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/366558.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号