什么是Dart中的Null安全性?
我听说过新的Dart空安全语言功能(NNBD),目前称为“ ”。 应该引入 。
功能规范可在此处找到,语言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
,否则将其转换为 值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
可用于标记 将 变量,即不是在声明它们时而是在访问它们时。这也意味着我们可以拥有稍后初始化的非空
实例字段 :
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
,这使它们不可为空:
void allowed({required String word}) => 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
}
另请参阅有关语法决定的本文。
?..
现在,级联运算符还具有一个新的空值感知运算符:?..
。
它导致仅当接收者 ,才执行以下级联操作。因此,?..
必须是级联序列中的第一个级联运算符:
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
的类型将类似于中定义的先前存在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>
为 const List<T>
。
Never
就我而言,不应被程序员使用。
以上是 什么是Dart中的Null安全性? 的全部内容, 来源链接: utcz.com/qa/400289.html