web-dev-qa-db-ja.com

.NetのDecimal.One、Decimal.Zero、Decimal.MinusOneの目的は何ですか

簡単な質問-Decimal型がこれらの定数を定義するのはなぜですか?なぜわざわざ?

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

63
Jasmine

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

BCLを介してリフレクターとDigを使用する場合、MinusOneとZeroはVBランタイムでのみ使用されます。これは主に、10進値とブール値の間の変換を提供するために存在します。MinusOneが選ばれる理由たまたま使用されていますが、ちょうど今日別のスレッドで登場しました( link

奇妙なことに、Decimal.Oneの値を見ると、どこでも使用されていないことがわかります。

なぜそれらが明示的に定義されているのかについては、私には難しい理由がありません。特定のパフォーマンスではなくと表示されますがあり、それらの存在に起因する可能性のある便利な指標のほんの一部です。私のguessは、BCLの開発中に誰かが便宜上追加したもので、削除されなかっただけです。

[〜#〜]編集[〜#〜]

@Paletaによるコメントの後に、もう少しconstの問題を調べてください。 Decimal.OneのC#定義はconst修飾子を使用しますが、ILレベルではstatic readonlyとして発行されます。 C#コンパイラはいくつかのトリックを使用して、この値をconstと事実上区別できないようにします(たとえば、インラインリテラル)。これは、このトリックを認識する言語で表示されます(VB.Netはこれを認識しますが、F#は認識しません)。

30
JaredPar

一部の.NET言語は、データ型としてdecimalをサポートしていません。これらの場合は、新しいDecimal(1)の代わりにDecimal.ONEを記述する方が便利(かつ高速)です。

同じ理由で、JavaのBigIntegerクラスにもZEROとONEがあります。

19
mihi