C# 将常量移动到单独的程序集

C# 将常量移动到单独的程序集,c#,.net-4.0,assemblies,C#,.net 4.0,Assemblies,我有一个项目,它利用了许多全局常量。最终,我计划提取程序的一些部分,并创建自己的程序集 单独为全局常量(即GlobalConstants.dll)创建一个程序集是否值得(或可能?),以便我可以在将来的程序集中使用此程序集 此方法将帮助我减少编码,并且我可以在各个项目中为常量保留相同的名称。对于多少项目,您希望相同的常量有用?如果有真正的理由,那么罚款;否则。。。不要 当然,若您有一些同样可能被重用的实用程序库,那个么它们在那个里可能是有意义的,只要按名称空间和类型适当地确定范围 就我个人而言,在

我有一个项目,它利用了许多全局常量。最终,我计划提取程序的一些部分,并创建自己的程序集

单独为全局常量(即GlobalConstants.dll)创建一个程序集是否值得(或可能?),以便我可以在将来的程序集中使用此程序集


此方法将帮助我减少编码,并且我可以在各个项目中为常量保留相同的名称。

对于多少项目,您希望相同的常量有用?如果有真正的理由,那么罚款;否则。。。不要

当然,若您有一些同样可能被重用的实用程序库,那个么它们在那个里可能是有意义的,只要按名称空间和类型适当地确定范围


就我个人而言,在我有了移动它们的实际、具体的目的之前,我会把它们放在一边。

虽然这当然是可能的,甚至可能是一个非常好的主意,但您应该知道,C编译器将常量视为值,而不是引用

我的意思是C#编译器将替换代码中常量的所有实例,并用值替换“变量”

这意味着,即使您更新程序集
GlobalConstants.dll
并将其复制到现有的某个应用程序中,也需要重新编译该应用程序。否则,将导致应用程序使用旧的常量值


为了克服这个问题,,您可以简单地使用
public static readonly
而不是
public const
,因为
readonly
修饰符与
const
的不同之处在于C编译器将其视为代码中的引用,而不是值。

创建单独常量程序集的一个原因是允许“不太复杂”更新,如错误消息和本地化,您可以将程序集更新为热修复程序,并降低破坏任何其他内容的风险

通常,我们发现共享常量有用的地方是拥有一个包含全局常量的业务实体层程序集,因为业务实体是我们架构中唯一的层。可以被(大多数)层访问

拥有一个单独的程序集会导致开销,根据您拥有的常量,您可能拥有一些直接依赖于功能的常量-例如,一个可用于在哈希表中查找值的键