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

问题描述 投票:0回答:3

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

例如:

internal static class Constants
{
    public const double Pi = 3.14159;
    public const int SpeedOfLight = 300000; // km per sec.
}
c# constants
3个回答
2
投票

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

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

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

要解决这个问题,并且您确实想向外界公开一个“常量”,请将符号声明为

public static readonly
。这样,如果该值被更新,任何引用它的外部程序集将自动使用更新的值,即使不需要重新编译。

但是如果你真的想使用

const
来代替,请确保它是 真的 一个永远不会改变的常数,即自然定律、物理常数,例如 Pi。


1
投票

当您下载 Nuget 包时,您无法访问内部类。开发人员决定您不需要访问这些。所以这些值对于这个包来说是“私有的”。

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

公共:访问不受限制。

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

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

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

private:访问仅限于包含类型。


0
投票
internal

的含义,但我认为它们缺少问题的一部分:

为什么将常量放在内部类中?
这主要是因为他们希望通过类似名称空间的东西来识别常量:

double myValue = Constants.Pi * 10;

或者

double myValue = OtherClass.Constants.Pi * 10;

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

为了使答案完整:

internal

用于保护常量,防止在程序集外部使用它们。

    

© www.soinside.com 2019 - 2024. All rights reserved.