21

なぜdecimalプリミティブ型ではないのですか?

Console.WriteLine(typeof(decimal).IsPrimitive);

出力false

これは基本型であり、言語の仕様の一部ですが、プリミティブではありません。フレームワークでどのプリミティブ型を表しdecimalますか?intたとえばm_value、タイプのフィールドがありますint。Aにはタイプdoubleのフィールドがあります。の場合はそうではありません。たくさんのsで表されているようですが、よくわかりません。m_valuedoubledecimalint

なぜそれはプリミティブ型のように見え、プリミティブ型のように動作しますが(いくつかの場合を除いて)、プリミティブ型ではありませんか?

4

3 に答える 3

22

直接的な答えではありませんが、のドキュメントにIsPrimitiveは、プリミティブ型が何であるかがリストされています。

http://msdn.microsoft.com/en-us/library/system.type.isprimitive.aspx

同様の質問がここで行われました:

http://bytes.com/topic/c-sharp/answers/233001-typeof-decimal-isprimitive-false-bug-feature

ジョンスキートから引用された回答:

CLRは、10進型に関する本質的な知識を持っている必要はありません。それは、演算子がオーバーロードされた別の値型と同じように扱います。たとえば、小数を直接操作するIL命令はありません。

私にdecimalは、CLS / CLIに準拠したい言語/ランタイムに存在しなければならないタイプのように見えます(したがって、キーワードをサポートする基本タイプであるため、「プリミティブ」と呼ばれます)が、実際の実装では真に「プリミティブ」である必要はありません(CLRではプリミティブデータ型とは見なされないため)。

于 2012-11-20T11:13:33.720 に答える
12

Decimalは128ビットのデータ型であり、コンピューターのハードウェアでネイティブに表現することはできません。たとえば、64ビットコンピュータアーキテクチャには通常、64ビット幅の整数レジスタとアドレス指定レジスタがあり、64ビットデータ型とアドレスを直接サポートできます。

ウィキペディアはそれを言います

言語とその実装に応じて、プリミティブデータ型は、コンピューターのメモリ内のオブジェクトと1対1で対応する場合としない場合があります。ただし、通常、基本的なプリミティブデータ型に対する操作は、最も高速な言語構造であると予想されます。

10進数の場合、内部で整数を使用する単なる複合データ型であるため、そのパフォーマンスは、コンピューターのメモリと直接相関するデータ型(ints、doublesなど)よりも遅くなります。

于 2012-11-20T11:22:14.673 に答える
4

以下の例を考えてみましょう。

     int i = 5;
    float f = 1.3f;
    decimal d = 10;

デバッガーを配置してネイティブ命令セットを検証すると、次のようになります。

ここに画像の説明を入力してください

intを見るとわかるように、プリミティブ型であるfloatはすべて、assignemnt演算を実行するために単一の命令を取りますが、非プリミティブ型であるdecimal、stringは、この演算を実行するために複数のネイティブ命令を取ります。

于 2018-01-06T11:43:50.553 に答える