14

Dartには、コンパイル時定数の概念があります。コンパイル時定数は、コンパイル時に解析および作成され、正規化されます。

たとえば、constPointのコンストラクタは次のとおりです。

class Point {
  final num x, y;
  const Point(this.x, this.y);
}

そして、これがあなたがそれを使う方法です:

main() {
  var p1 = const Point(0, 0);
  var p2 = const Point(0, 0);
  print(p1 == p2); // true
  print(p1 === p2); // true
}

これは自明ではない機能であり、他の動的言語の機能との類似点はないようです。constすべてのフィールドがfinalである必要があり、constコンストラクターが必要であるなど、オブジェクトには制限があります。

Dartにコンパイル時定数があるのはなぜですか?

4

2 に答える 2

17

メーリングリストから、FlorianLoitschは次のように書いています。

コンパイル時定数の正規化プロパティは優れていますが、それらを使用する主な理由ではありません。コンパイル時定数の本当の利点は、構築時に任意の実行を許可しないため、コードを実行したくない場所で使用できることです。たとえば、静的変数の初期化子は、トップレベルでの実行を回避するために、最初はコンパイル時定数に制限されていました。つまり、プログラムが「main」で始まり、他の場所ではないことを確認します。

于 2012-09-14T05:49:54.293 に答える
1

ここでのラッセの答えは私を大いに助けてくれました

では、とにかくコンパイル時定数は何に適していますか?

  • それらは列挙型に役立ちます。
  • スイッチの場合は、コンパイル時定数値を使用できます。
  • それらは注釈として使用されます。

Dartが変数の初期化を遅らせる前は、コンパイル時定数の方が重要でした。それ以前は、「var x=foo;」のような初期化されたグローバル変数しか宣言できませんでした。「foo」がコンパイル時定数だった場合。その要件がなければ、ほとんどのプログラムはconstオブジェクトを使用せずに作成できます。

于 2018-06-14T01:48:05.403 に答える