Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 下面的常量命名构造函数和静态常量字段有什么区别?_Dart - Fatal编程技术网

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

Dart 下面的常量命名构造函数和静态常量字段有什么区别?,dart,Dart,下面的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

下面的
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不可变点(0,0);
由于Dart的规范常量特性,所有引用此常量类的值都相同的
0,0
(包括对
ImmutablePoint.originA()
或甚至
ImmutablePoint(0,0)
)的其他调用)都将减少到相同的编译时常量。因此,从实用的角度来看,无参数的
const
构造函数和
static const
变量都会产生几乎相同的编译代码,从而提高性能


(虽然从严格挑剔的角度来看,
静态常量
可能会在引用常量之前被编译为包含对
不可变点
类型的静态引用。我对Dart如何编译这些情况的知识还不够,因此不能肯定地说,但我可以告诉你,即使确实发生了,p静态类型引用的性能命中率将在“纳秒或更短”级别,可以忽略不计。不要进行微优化,只需使用您认为更可读或更方便的方法。)

从字面上看,一个是构造函数,另一个是静态变量。构造函数允许您定义常量,而静态变量已经是常量。这应该是不言自明的

从性能角度看?两个值解析为同一个常量定义的对象:

const不可变点(0,0);
由于Dart的规范常量特性,引用此常量类的所有内容都具有相同的值
0,0
(包括对
ImmutablePoint.originA()
甚至
ImmutablePoint(0,0)
)因此,从实用的角度来看,无参数的
const
构造函数和
静态const
变量都会产生几乎相同的编译代码,从而提高性能


(虽然从严格挑剔的角度来看,
静态常量
可能会在引用常量之前被编译为包含对
不可变点
类型的静态引用。我对Dart如何编译这些情况的知识还不够,因此不能肯定地说,但我可以告诉你,即使确实发生了,p静态类型引用的性能命中率将处于可忽略不计的“纳秒或更短”级别。不要进行微优化,只要使用您认为更可读或更方便的方法即可。)

常量变量定义并命名单个值

const
构造函数定义了一种创建新值的方法。 如果该构造函数作为
常量ImmutablePoint.originA()
调用,则由于常量规范化,它会创建变量包含的相同常量值。但是,您也可以调用
新ImmutablePoint.originA()
(带或不带
)并获取一个与任何其他点对象不同的新实例


Dart构造函数为
const
意味着可以使用
const
调用它,而不是必须调用它。

常量变量定义并命名单个值

const
构造函数定义了一种创建新值的方法。 如果该构造函数作为
常量ImmutablePoint.originA()
调用,则由于常量规范化,它会创建变量包含的相同常量值。但是,您也可以调用
新ImmutablePoint.originA()
(带或不带
)并获取一个与任何其他点对象不同的新实例


Dart构造函数是
const
意味着可以使用
const
调用它,而不是必须调用它。

注意
静态const ImmutablePoint originB=const ImmutablePoint(0,0);
可以简化为
静态const ImmutablePoint originB=ImmutablePoint(0,0)由于Dart编译器的智能性,
请注意,由于Dart编译器的智能性,
静态常量不可变点originB=常量不可变点(0,0);
可以简化为
静态常量不可变点originB=不可变点(0,0);