在阅读dart官网提供的文档时,发现多出有top-level functions和top-level variables,就自认为是个新(高大上)概念,第一印象可能是放在类中的第一个变量和方法,就觉得需要重视并学习起来。经过学习发现其实并不是这么回事,仅仅是个叫法而已。
我目前的理解top-level表示类中第一层级作用域的函数和变量,什么是第一层级呢,就是与main函数同一段位的方法或变量,如果你把变量和方法写在main函数里就属于第二层级的变量和函数。这理解可能存在偏差。
1.Dart 支持顶级函数(例如main()),以及绑定到类或对象的函数(分别为静态方法和实例方法)。您还可以在函数中创建函数(嵌套函数或局部函数)。
2.同样,Dart 支持顶级变量,以及绑定到类或对象的变量(静态变量和实例变量)。实例变量有时称为字段或属性。
3.顶级和类变量被延迟初始化;初始化代码在第一次使用该变量时运行。
4.通常 Dart 的控制流分析可以检测到一个不可为空的变量在使用之前何时设置为非空值,但有时分析会失败。两种常见的情况是顶级变量和实例变量: Dart 经常无法判断是否设置了,所以不尝试。
5.每个应用程序都必须有一个顶级main()函数,作为应用程序的入口点。该main()函数返回void并有一个可选List参数作为参数。
6.对于常见或广泛使用的实用程序和功能,请考虑使用顶级函数而不是静态方法。
先看看顶级变量延迟初始化的情况:
- class Student {}
- class XiaoMing extends Student {
- XiaoMing(){
- print("我叫小明,今年19岁");
- }
-
- }
- class DaMao extends Student {
- DaMao(){
- print("我叫大茅,今年18岁");
- }
- }
- Student student = DaMao(); //student是顶层变量,由于有延迟加载机制导致没有实例化DaMao这个对象
- main() {
- student = XiaoMing();
- }
再看看类变量延迟初始化的情况:
- class TestTopLevel {
- static Student student = Student(); //TestTopLevel类的类变量,
- }
- class Student {
- Student() {
- print("我是一名学生");
- }
- }
- main() {
- TestTopLevel();//由于有延迟加载机制导致没有实例化Student这个对象
- }
1.主要还是性能方面的考量