Flutter Dart中静态变量和常量变量之间的差异

Flutter Dart中静态变量和常量变量之间的差异,flutter,dart,compilation,constants,Flutter,Dart,Compilation,Constants,检查以下两个示例: 类内的静态常量: 类会话存储{ 静态常量字符串_keysionexist='storage.key'; } 只是班外的一个常量: 常量字符串_keysionexist='storage.key'; 类会话存储{ } 在类内部有一个静态常量变量,或者在Dart中将它声明为类外部的常量,这两者之间有什么区别或含义吗? 也许编译后的代码会改变? 哪一个性能更好? 如果变量对文件是私有的,我们应该遵循哪一个? cons的声明必须使用const,您必须将其声明为静态const,而不仅仅

检查以下两个示例:

类内的静态常量:

类会话存储{ 静态常量字符串_keysionexist='storage.key'; } 只是班外的一个常量:

常量字符串_keysionexist='storage.key'; 类会话存储{ } 在类内部有一个静态常量变量,或者在Dart中将它声明为类外部的常量,这两者之间有什么区别或含义吗? 也许编译后的代码会改变? 哪一个性能更好? 如果变量对文件是私有的,我们应该遵循哪一个?
cons的声明必须使用const,您必须将其声明为静态const,而不仅仅是const

静态、最终和常量在Dart中表示完全不同的内容:

静态意味着成员在类本身而不是在类的实例上可用。这就是它的全部含义,它不用于任何其他用途。静态修改成员

final表示单个赋值:final变量或字段必须具有初始值设定项。赋值后,最终变量的值不能更改。final修改变量

const在Dart中的含义更为复杂和微妙。常量修改值。您可以在创建集合(如常量[1,2,3])时使用它,也可以在构造对象(而不是新对象)时(如常量点2,3)使用它。在这里,const意味着对象的整个深层状态可以在编译时完全确定,并且对象将被冻结并且完全不可变

常量对象有几个有趣的属性和限制: 它们必须从可在编译时计算的数据中创建。const对象无权访问运行时需要计算的任何内容。1+2是有效的常量表达式,但new DateTime.now不是。 它们是深刻的、可传递的不可变的。如果有包含集合的最后一个字段,则该集合仍然可以是可变的。如果您有一个const集合,那么其中的所有内容也必须是const,递归地。 他们被规范化了。这有点像字符串插入:对于任何给定的const值,将创建单个const对象并重复使用,无论对const表达式求值多少次。换言之:

getConst() => const [1, 2]; 

    main() { 
      var a = getConst(); 
      var b = getConst(); 
      print(a === b); // true 
    } 
我认为Dart在保持语义和关键字清晰明了方面做得相当好。有一段时间,const用于const和final。这令人困惑。唯一的缺点是,当您希望在类本身上指示单个赋值的成员时,必须同时使用两个关键字:static final

也: 我建议你看看这个问题


cons的声明必须使用const,您必须将其声明为静态const,而不仅仅是const

静态、最终和常量在Dart中表示完全不同的内容:

静态意味着成员在类本身而不是在类的实例上可用。这就是它的全部含义,它不用于任何其他用途。静态修改成员

final表示单个赋值:final变量或字段必须具有初始值设定项。赋值后,最终变量的值不能更改。final修改变量

const在Dart中的含义更为复杂和微妙。常量修改值。您可以在创建集合(如常量[1,2,3])时使用它,也可以在构造对象(而不是新对象)时(如常量点2,3)使用它。在这里,const意味着对象的整个深层状态可以在编译时完全确定,并且对象将被冻结并且完全不可变

常量对象有几个有趣的属性和限制: 它们必须从可在编译时计算的数据中创建。const对象无权访问运行时需要计算的任何内容。1+2是有效的常量表达式,但new DateTime.now不是。 它们是深刻的、可传递的不可变的。如果有包含集合的最后一个字段,则该集合仍然可以是可变的。如果您有一个const集合,那么其中的所有内容也必须是const,递归地。 他们被规范化了。这有点像字符串插入:对于任何给定的const值,将创建单个const对象并重复使用,无论对const表达式求值多少次。换言之:

getConst() => const [1, 2]; 

    main() { 
      var a = getConst(); 
      var b = getConst(); 
      print(a === b); // true 
    } 
我认为Dart在保持语义和关键字清晰明了方面做得相当好。有一段时间,const用于const和final。这令人困惑。唯一的缺点是,当您希望在类本身上指示单个赋值的成员时,必须同时使用两个关键字:static final

也: 我建议你看看这个问题

在类内部有一个静态常量变量,或者在Dart中将它声明为类外部的常量,这两者之间有什么区别或含义吗? 明显的区别在于,静态版本必须与cl一起引用 屁股的名字。除了名称解析的更改之外,名称解析应该是相同的

也许编译后的代码会改变? 哪一个性能更好? 它们都是编译时常量。应该没有什么区别

如果变量对文件是私有的,我们应该遵循哪一个? 如果您想要Dart库(通常指文件)专用的内容,请在其前面加上前缀u。不管它是全局的还是静态的

在类内部有一个静态常量变量,或者在Dart中将它声明为类外部的常量,这两者之间有什么区别或含义吗? 明显的区别是静态版本必须使用类名引用。除了名称解析的更改之外,名称解析应该是相同的

也许编译后的代码会改变? 哪一个性能更好? 它们都是编译时常量。应该没有什么区别

如果变量对文件是私有的,我们应该遵循哪一个?
如果您想要Dart库(通常指文件)专用的内容,请在其前面加上前缀u。不管它是全局的还是静态的。

你说应该没有任何区别。但我怎么能确定呢?我来自java,编译后的文件仍然可读,所以我可以看到我的代码在编译后的工件中是如何变化的,在dart中有什么方法可以做到这一点吗?你说应该没有任何区别。但我怎么能确定呢?我来自java,在java中编译的文件仍然可读,所以我可以看到我的代码在编译的工件中是如何变化的,在dart中有什么方法可以做到这一点吗?