C#の定数


9

コンパイラが定数値をアセンブリメタデータに格納するのはなぜですか?それらは、アセンブリメタデータから中間言語コードに直接埋め込まれていますか?


1
:これは本当に「なぜ」を扱うが、それでも面白いですしないstackoverflow.com/a/2128633/128384
stijn

私はこの質問で混乱しています。メタデータにない場合、他にどこに保存されますか?質問を明確にできますか?
Eric Lippert、2013年

回答:


4

私が見つけたそれについて考える最良の方法は次のとおりです。コンパイル時にconstが使用されるリテラルに変換されます。

それが定義されたアセンブリのマニフェストに入る唯一の理由は、それを消費者がアクセスできるようにすることでした。これは特定のタイプの一部であり、そのタイプのメタデータは、それを消費するアセンブリではなく、そのアセンブリに格納されます。

そのため、これは使用時のインラインリテラルであり、メタデータ内の消費可能な型カプセル化プロパティまたはフィールドです。


2

私はかなり長い間自分を調査し、本からこれが理由である可能性があることを発見しました...

定数値は変更されないため、定数は定義型の一部と見なされます。したがって、定数を定義するとメタデータが作成されます。


1

2つのアセンブリを混同すると思います。

定数は、それが定義されているアセンブリのメタデータにのみ保存さます。メタデータには、アセンブリ内のすべてのタイプとメンバーに関する情報が含まれ、定数はメンバーです。

定数に関する情報は、それが使用されるアセンブリには保存されません。定数値または文字列をソースに直接書き込んだ場合と同様に、定数値はILで直接使用されます。

例:私のアプリケーションの1つは、データベーステーブルとフィールドを識別するために多くの定数を使用しています。すべての定数のみを含む1つのアセンブリがあります。

アプリケーションをビルドするときに、Visual Studioの「定数」アセンブリへの参照を追加します。アセンブリには定数のみが含まれているため、アプリケーションではそのアセンブリへの参照はなく、実行時に「定数」アセンブリは必要ありません。


2
ただし、これは定数がメタデータに格納される理由を実際には説明していません。それはなぜか周りに踊りますが、OPが2つのアセンブリを混乱させることはないと思います。2つのアセンブリを使用するため、2つのアセンブリの問題と見なされますが、慣例は一般的ではないと思います。定数は通常、それらが使用されるのと同じアセンブリで定義されます。
Robert Harvey

@RobertHarvey典型的なケースの推定は、多くの企業のC#同僚のスキルを過大評価しています。私は、constが何であるか、そしてなぜアセンブリ間でそれらを呼び出さないのかを説明しなければなりませんでした。
ジミー・ホッファ

1

定数はコンパイル時に認識され、アセンブリのメタデータに格納されます。つまり、定義できるのはプリミティブ型の定数のみです。

はい、メタデータから直接読み込まれます。実行時にメモリが割り当てられることはありません。


1
Decimalはプリミティブ型ではありませんが、10進定数を作成できます。また、定数がnullであれば、どのような参照型の定数でも作成できます。
Eric Lippert、2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.