gpt4 book ai didi

.net - 为什么私有(private)常量存储在 .NET 程序集中?

转载 作者:行者123 更新时间:2023-12-04 14:33:27 24 4
gpt4 key购买 nike

在编译为 IL 时,代码引用的常量将替换为它们的实际值。

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

但是为什么私有(private)常量存储在那里呢?在定义它们的程序集中的代码的 IL 中没有对这些常量的引用,并且它们不会在程序集外部公开以供引用。

那么在编译代码后需要访问这些值吗?

在我看来,程序集中的所有常量都应该是公共(public)的,而私有(private)常量应该是一种语言级的特性,它只会导致编译器发出文字值。

最佳答案

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

反射访问和 IL 重写工具作为私有(private)内容的重要用例浮现在脑海中。此外,当大多数元数据仍然存在时,调试更容易。例如,您可以使用 Edit&Continue 来使用以前未使用的成员。您可以使用立即窗口调用静态未使用的成员。

也许对 PDB 符号也有影响,尽管我现在想不起来。

请注意,.NET 程序集包含大量对反射访问有用的元数据。除了可检查之外,属性根本没有运行时影响。程序集应该是丰富的和 self 描述的。

有人可能会争辩说常量特别没有用,因为它们总是静态未使用。然而,这并不意味着它们没有反射用途。他们还可以帮助反编译代码。聪明的反编译器会注意到某个文字与附近声明的常量相同。此外,为什么要对常量进行异常(exception)处理以优化它们呢?典型程序中常量很少。即使假设移除它们会更好,投资也很难得到返回。同时更好地开发有用的语言功能。

关于.net - 为什么私有(private)常量存储在 .NET 程序集中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26811337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com