当前位置: 首页 > 面试题库 >

什么是Dart中的Null安全性?

郎华皓
2023-03-14
问题内容

我听说过新的Dart空安全语言功能(NNBD),目前称为“ “不可空”实验 ”。 默认情况下 应该引入 non-
nullable

功能规范可在此处找到,语言GitHub问题可在此处找到。

它是如何工作的,我可以在哪里尝试?


问题答案:

当前可以在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被访问,这里将仅被调用。此外,您还可以声明一个late final没有初始化程序的a,它与仅具有一个late变量相同,但是只能被分配一次。

late final int x;
// w/e
x = 5; // allowed
x = 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不能实例化其本身。
不过NeverList<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就我而言,不应被程序员使用。



 类似资料:
  • 问题内容: 什么啊 是任何实例吗? 属于什么集合? 它在内存中如何表示? 问题答案: 是否是任何实例? 不,没有类型是。 15.20.2类型比较运算符 在运行时,运算符的结果是,true如果的值不是,并且引用可以强制转换为而不引发。否则结果为。 这意味着对于任何类型的E和R,对于任何,在那里,永远是。 “ null”属于什么集合? JLS 4.1类型和值的种类 还有一个特殊的类型,即的类型,它没有

  • 如果你正在使用Java 7工作的话,null安全是Kotlin中最令人感兴趣的特性之一了。但是就如你在本书中看到的,它好像不存在一样,一直到上一章我们几乎都不需要去担心它。 通过我们自己创造的亿万美金的错误对null的思考,我们有时候的确需要去定义一个变量包不包含一个值。在Java中尽管注解和IDE在这方面帮了我们很多,但是我们仍然可以这么做: Forecast forecast = null;

  • 本文向大家介绍什么是安全策略?相关面试题,主要包含被问及什么是安全策略?时的应答技巧和注意事项,需要的朋友参考一下 回答:安全策略是一个正式且简短的计划,其中包含组织的目标,目的和信息安全程序。简而言之,它定义了确切地需要保护免受威胁的条件以及在威胁发生时如何处理情况。

  • 在我正在做的一个项目中,应用程序是使用类似于以下命令启动的: 我从未见过选项。稍微搜索一下,它似乎用于在Java应用程序中配置随机数生成。 是这样吗?什么时候应用?

  • 我看到了不同的PHP二进制文件,比如非线程或线程安全? 这是什么意思? 这些软件包之间有什么区别?

  • 我对Spring和Spring Security都是新手。我在读关于Spring Security的文章,它提出了principal的概念,应该是当前登录的用户。但如果我们有多个当前登录用户呢?那么,我的问题是,在Spring安全中,校长到底是什么? 例如,我已经阅读了本教程: http://www.mkyong.com/spring-security/get-current-logged-in-