我在很多项目中都见过它。为什么开发者在C#中使用内部类来存储常量变量?
例如:
internal static class Constants
{
public const double Pi = 3.14159;
public const int SpeedOfLight = 300000; // km per sec.
}
因为当常量公开(而不是内部)时,存在这样的危险:当外部程序集引用它们时,当声明它们的程序集用新的常量值更新时,它可能会变得“过时”,但引用的程序集是没有重新编译。
例如,包含“更新”常量值的引用程序集形成“插件”架构的一部分,其中插件的新版本可以简单地“放入”引用应用程序的文件夹中,而无需重新编译和重新部署应用程序。即使应用程序引用了最初声明它的“插件”程序集中的常量,应用程序也不会使用新的更新值,而是继续使用旧值。
发生这种情况是因为当编译器看到一个常量时,它会将其值“内联”到包含(“引用”)它的表达式或语句中,无论它在哪里。
要解决这个问题,并且您确实想向外界公开一个“常量”,请将符号声明为
public static readonly
。这样,如果该值被更新,任何引用它的外部程序集将自动使用更新的值,即使不需要重新编译。
但是如果你真的想使用
const
来代替,请确保它是 真的 一个永远不会改变的常数,即自然定律、物理常数,例如 Pi。
当您下载 Nuget 包时,您无法访问内部类。开发人员决定您不需要访问这些。所以这些值对于这个包来说是“私有的”。
有关访问修饰符的更多信息:
公共:访问不受限制。
protected :访问仅限于包含类或从包含类派生的类型。
内部:访问仅限于当前程序集。
受保护的内部:访问仅限于当前程序集或从包含类派生的类型。
private:访问仅限于包含类型。
internal
的含义,但我认为它们缺少问题的一部分:
为什么将常量放在内部类中?这主要是因为他们希望通过类似名称空间的东西来识别常量:
double myValue = Constants.Pi * 10;
或者
double myValue = OtherClass.Constants.Pi * 10;
如果没有内部类,它们看起来更像成员/属性。至少当他们不使用 UPPER_CASING 进行命名时。
为了使答案完整:
internal
用于保护常量,防止在程序集外部使用它们。