代码引用的常量在编译为IL时会被实际值替换。
由于公共常量可以由特定程序集之外的代码引用,因此将它们存储在程序集的元数据中是有意义的。
但为什么私有常量存储在那里?在定义它们的程序集中的代码的IL中没有引用这些常量,并且它们不会暴露在程序集外部引用。
那么编译代码后需要访问哪些值?
在我看来,程序集中的所有常量都应该是公共的,而私有常量应该是一个语言级别的功能,它只会导致编译器发出文字值。
答案 0 :(得分:3)
C#编译器可以优化各种的私有内容。不仅仅是常数。它可以删除未使用的成员,类,代码。它可以剥夺私人名称。它可以删除私有属性并用方法替换它们。等
反思访问和IL重写工具成为私人事物的重要用例。此外,当大多数元数据仍然存在时,调试更容易。例如,您可以使用“编辑和继续”来使用以前未使用的成员。您可以使用立即窗口调用静态未使用的成员。
也许对PDB符号也有影响,尽管我现在也想不到。
请注意,.NET程序集包含许多仅对反射访问有用的元数据。除了可检查之外,属性除了运行时没有任何影响。大会意味着丰富和自我描述。
有人可能会争辩说常量是无用的,因为它们总是静态未使用。然而,这并不意味着它们没有反射用途。他们还可以帮助反编译代码。智能反编译器可以注意到某个文字与附近声明的常量相同。此外,为什么要对常量进行异常以优化它们?典型程序中的常量非常少。即使假设移除它们会更好,投资也难以获得回报。在同一时间更好地开发有用的语言功能。