为什么我们在 C# 中使用内部类作为常量

本文关键字:内部类 常量 我们 为什么 | 更新日期: 2023-09-27 17:55:26

我在许多项目中都见过它。为什么开发人员使用内部类在 C# 中存储常量变量?

例如:

internal static class Constants
{
    public const double Pi = 3.14159;
    public const int SpeedOfLight = 300000; // km per sec.
}

为什么我们在 C# 中使用内部类作为常量

简单地说,设计人员决定需要在同一程序集中使用此类。并且不得向引用程序集的任何项目公开或访问它。

下载 Nuget 包时,无法访问内部类。开发人员决定您不需要访问这些。因此,这些值对于此包是"私有的"。

有关访问修饰符的更多信息:

公共:访问不受限制。

protected :访问仅限于包含类或从包含类派生的类型。

内部:访问仅限于当前程序集。

受保护的内部:访问仅限于当前程序集或从包含类派生的类型。

私有:访问仅限于包含类型。

因为当常量公开(而不是内部)时,存在这样的危险:当外部程序集引用它们时,当声明它们的程序集使用新的常量值更新时,它可能会变得"过时",但引用程序集不会重新编译。

例如,包含"更新"常量值的引用程序集构成了"插件"体系结构的一部分,其中插件的新版本可以简单地"拖放"到引用应用程序的文件夹中,而无需重新编译和重新部署应用程序。即使应用程序从最初声明它的"plugin"程序集引用了常量,应用程序也不会使用新的更新值,而是继续使用旧的值。

发生这种情况是因为当编译器看到一个常量时,它会将其值"内联"到包含("引用")它的表达式或语句中,无论它在哪里。

要解决这个问题,并且您确实想向外界公开一个"常数",而是将符号声明为public static readonly。这样,如果该值被更新,引用它的任何外部程序集都将自动使用更新值,即使不需要重新编译也是如此。

但是,如果您真的想改用const,请确保它确实是一个永远不会改变的常数,即自然法则,物理常数,如Pi。

虽然大多数答案都描述了internal的含义,但我认为它们缺少了一部分问题:为什么要在内部类中放置常量?

这主要是因为他们希望通过感觉像命名空间的东西来识别常量:

double myValue = Constants.Pi * 10;

double myValue = OtherClass.Constants.Pi * 10;

如果没有内部类,它们看起来更像成员/属性。至少当他们不使用UPPER_CASING进行命名时。

为了使答案完整:internal用于防止常量在程序集外部使用它们。