アセンブリ サイズの増加は、基本的に、C# コンパイラがconst
-ness に関する追加のメタデータを出力するためです。
この短いプログラムからどのような成果が期待できますか?
class Program
{
public const int C = 0;
public int F = 0;
static void Main(string[] args)
{
foreach (FieldInfo field in typeof(Program).GetFields())
{
Console.WriteLine("{0}: IsLiteral = {1}", field.Name, field.IsLiteral);
}
}
}
実際の出力は次のとおりです。
C: IsLiteral = True
F: IsLiteral = False
これは、C# ソースの宣言と正確に一致します。2 つのフィールド、そのうちの 1 つですconst
。
Constant
ここで、C# コンパイラがメタデータを出力しないことを決定したとしましょう。出力は次のようになります。
C: IsLiteral = False
F: IsLiteral = False
両方のフィールドが非として表示されるため、C# ソース コードと比較すると明らかに正しくありませんconst
。
最後に、C# コンパイラがメタデータをまったく出力しないことを決定したとしましょうC
(とにかくフィールドの値を "インライン化" するため):
F: IsLiteral = False
リフレクションは、C# ソース コードに明確に存在するフィールドの存在を報告しなくなるため、これも正しくありません。少なくとも私にとっては、眉をひそめる良い機会になるでしょう。
これらの反例は、const
フィールドに対しても完全なメタデータが発行されることがなぜ良いことなのかを明確にするはずです。