1. ホーム
  2. c#

.NetのDecimal.One、Decimal.Zero、Decimal.MinusOneは何のためにあるのですか?

2023-10-02 16:03:48

質問

単純な質問ですが、なぜDecimal型はこれらの定数を定義しているのでしょうか?なぜわざわざ?

私はこれが言語によって定義されている理由を探しているのであって、可能な使い方やコンパイラの効果ではありません。そもそも、なぜこれをそこに置くのでしょうか。コンパイラは Decimal.Zero と同じように簡単に 0m をインライン化できるので、コンパイラのショートカットとしてこれを購入することはできません。

どのように解決するのですか?

小さな明確化。 これらは実際には静的な読み取り専用の値であり、定数ではありません。 これは .Net では明確な違いがあります。なぜなら定数値は インライン されるため、コンパイルされたアセンブリでの使用状況を追跡することができないからです。 しかし、静的な読み取り専用の値はコピーされず、代わりに参照されます。 これは、それらの使用を分析できることを意味するので、質問にとって有利です。

reflector を使用して BCL を調べると、MinusOne と Zero は VB ランタイムでのみ使用されることに気づきます。 これは主に、Decimal 値と Boolean 値の間の変換を提供するために存在します。 なぜMinusOneが使われるかは、偶然にもちょうど今日、別のスレッドで話題になりました( リンク )

奇妙なことに、Decimal.Oneの値を見てみると、どこにも使われていないことに気がつきます。

なぜそれらが明示的に定義されているのかについては ... 明確な理由があるとは思えません。 そこには が現れる。 は、具体的な性能はなく、その存在に帰することができるのは、ちょっとした便宜的な措置に過ぎない。 私の 推測 は、BCL の開発中に便宜上誰かが追加し、そのまま削除されなかったのだと思います。

EDIT

に掘られた const の問題をもう少し掘り下げてみました。 C# の定義では Decimal.Oneconst 修飾子を使いますが、これは static readonly としてILレベルで出力されます。 C#コンパイラはいくつかのトリックを使って、この値を事実上 const (とほとんど区別がつきません(たとえば、インライン・リテラル)。 これは、このトリックを認識する言語では表示されます (VB.Net はこれを認識しますが、F# は認識しません)。