下面的a
和b
有什么区别?
class ImmutablePoint {
const ImmutablePoint(this.x, this.y);
final int x;
final int y;
const ImmutablePoint.originA() : this(0, 0);
static const ImmutablePoint originB = const ImmutablePoint(0, 0);
}
void main() {
const a = ImmutablePoint.originA();
const b = ImmutablePoint.originB;
}
const
构造函数定义了一种创建新值的方法。如果该构造函数被调用为const ImmutablePoint.originA()
,那么由于常量规范化,它将创建与变量包含的常量值相同的常量值但是,您也可以调用new ImmutablePoint.originA()
(带或不带new
(,并获得一个与任何其他点对象不同的新实例。
Dart构造函数为const
意味着它可以使用const
调用,而不是说它<em]必须>。
从字面的角度来看,一个是构造函数,另一个是静态变量。构造函数允许您定义常量,而静态变量已经是一个常量。这么多应该是不言自明的。
从性能角度来看?两个值都解析为相同的常量定义对象:
const ImmutablePoint(0, 0);
由于Dart的规范常量特性,引用具有相同值0,0
的常量类的所有内容(包括对ImmutablePoint.originA()
甚至ImmutablePoint(0, 0)
的其他调用(都将减少为指向相同的编译时常量。因此,从实用的角度来看,无参数const
构造函数和static const
变量都会产生几乎相同的编译代码,从而提高性能。
(尽管从严格挑剔的角度来看,在引用常量之前,static const
可能会被编译为包括对ImmutablePoint
类型的静态引用。我对Dart如何编译这些情况还不够了解,不能肯定地说,但我可以告诉你,即使真的发生了,静态类型引用的性能打击也将在"纳秒或更短"的时间内。(ot;可忽略的层次。不要进行微观优化,只要使用你认为更可读或更方便的方法即可。(