Dart中static和const变量的区别

eqqqjvef  于 2023-05-11  发布在  其他
关注(0)|答案(3)|浏览(181)

检查这两个示例:
static const在类内部:

class SessionStorage {
  static const String _keySessionExist = 'storage.key';
}

只有类外的const

const String _keySessionExist = 'storage.key';

class SessionStorage {

}
  • Dart中,在类内部有一个static const变量,或者只是在类外部将它声明为const,这两者之间有什么区别或影响吗?
  • 编译后的代码可能会发生变化?
  • 哪一个性能更好?
  • 如果变量是文件的私有变量,我们应该遵循哪一个?
62o28rlo

62o28rlo1#

cons的声明必须使用const。您必须将其声明为static const,而不仅仅是const
staticfinalconst在Dart中的含义完全不同:
static意味着成员在类本身而不是类的示例上可用。这就是它的全部含义,它不用于其他任何东西。static修改 * 成员 *。
final表示单分配:一个final变量或字段 * 必须 * 有一个初始化器。一旦赋值,最终变量的值就不能更改。final修改 variables
const在Dart中有一个更复杂和微妙的含义。const修改 values。你可以在创建集合时使用它,比如const [1,2,3],也可以在构造对象(而不是new)时使用它,比如const Point(2,3)。在这里,const意味着对象的整个深度状态可以在编译时完全确定,并且对象将被冻结并且完全不可变。
Const对象有几个有趣的属性和限制:它们必须从可以在编译时计算的数据创建。const对象不能访问运行时需要计算的任何内容。1 + 2是一个有效的常量表达式,但new DateTime.now()不是。它们是深度传递不可变的。如果您有一个包含集合的final字段,则该集合仍然可以是可变的。如果你有一个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

另外:

我建议你看看这个问题
What is the difference between the "const" and "final" keywords in Dart?

x6492ojm

x6492ojm2#

  • 在Dart中,在类内部有一个static const变量,或者只是在类外部声明为const,这两者之间有什么区别或影响吗?

明显的区别是static版本必须用类名引用。除了名称解析中的更改外,应相同。

  • 编译后的代码可能会发生变化?
  • 哪一个性能更好?

它们都是编译时常量。应该没什么区别。

  • 如果变量是文件的私有变量,我们应该遵循哪一个?

如果你想要一些Dart库的私有内容(通常指文件),那么用_作为前缀。不管它是全局的还是static

zujrkrfu

zujrkrfu3#

如果同时有多个带有静态字段的Class示例,则该字段的值将仅在内存中存储一次。如果您不能定义static const,但可以定义static final字段,则会很有帮助。

void main() {
  final a1 = A();
  final a2 = A();
  print(a1.b == a2.b); //true
}

class A {
  static final _b = B();
  
  final b = _b;
}

class B {}

相关问题