下面的常量命名构造函数和静态常量字段有什么区别



下面的ab有什么区别?

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;可忽略的层次。不要进行微观优化,只要使用你认为更可读或更方便的方法即可。(

最新更新