为什么我无法从全局范围运行静态 void 方法?



我有一个类,我想在其中调用一个静态方法来初始化一些东西。我试着从全局范围调用它,比如这个简化的例子:

class MyClass{
static bool initialized = false;

static void init(){
initialized = true;
}
}
MyClass.init();

void main() async {  
// Do something useful
}

这会导致以下错误:

  • 函数必须有一个明确的参数列表
  • 名称"MyClass"已定义

我发现有点奇怪的是,如果我让init()方法返回一些东西,并将结果分配给一个变量,它就会起作用:

class MyClass{
static bool initialized = false;

static bool init(){
initialized = true;
return true;
}
}
bool _dummy = MyClass.init();

void main() async {  
// Do something useful
}

为什么会这样?是否有更好的解决方法从全局范围调用staticvoid方法?

原因是静态变量在Dart中是延迟求值的,所以它们在第一次访问时会首先得到一个值。

这意味着:中的MyClass.init()

bool _dummy = MyClass.init();

仅当有东西试图访问变量_dummy时才被执行。这也意味着以下在全球范围内:

MyClass.init();

在Dart中没有任何意义,因为这段代码永远不会被执行,因为没有对代码的引用。

这种设计的原因可以在Dart语言规范:中找到描述

带有初始化表达式的静态变量声明是延迟初始化的。

之所以给出惰性语义,是因为我们不希望使用一种语言来定义昂贵的初始化计算,从而导致应用程序启动时间过长。这对于Dart来说尤其重要,因为它必须支持客户端应用程序的编码

https://dart.dev/guides/language/specifications/DartLangSpec-v2.10.pdf

最新更新