为什么专用常量存储在.NET程序集中



代码引用的常量在编译到IL时会被其实际值替换。

由于公共常量可以由特定程序集之外的代码引用,因此将它们存储在程序集的元数据中是有意义的。

但是为什么私有常量存储在那里呢?在定义这些常量的程序集中,代码的IL中没有对这些常量的引用,它们也不会在程序集外部被引用。

那么,在编译代码之后,需要什么来访问这些值呢?

在我看来,程序集中的所有常量都应该是公共的,而私有常量应该是一个语言级别的功能,它只会导致编译器发出文字值。

C#编译器可以优化掉所有类型的私有内容。不仅仅是常数。它可以删除未使用的成员、类和代码。它可以去掉私人名字。它可以删除私有属性并用方法替换它们。等

反射访问和IL重写工具是私人内容的重要用例。此外,当大多数元数据仍然存在时,调试更容易。例如,您可以使用Edit&继续使用以前未使用的成员。您可以使用即时窗口调用静态未使用的成员。

也许PDB符号也有含义,尽管我现在想不出任何含义。

请注意,.NET程序集包含许多元数据,这些元数据仅对反射访问有用。属性除了可检查之外,根本没有任何运行时含义。程序集旨在丰富和自我描述。

有人可能会争辩说,常数保存起来特别无用,因为它们总是静态地未使用。然而,这并不意味着它们没有反射用途。它们还可以帮助反编译代码。智能反编译器可能会注意到某个文字与附近声明的常量相同。此外,为什么要为常量破例来优化它们呢?典型程序中的常量很少。即使假设去掉它们会更好,投资也很难得到回报。最好同时开发有用的语言功能。

相关内容

最新更新