更改常量值时如何避免重新编译程序集? (C#)
How to avoid recompiling assemblies when changing constant values? (C#)
我正在尝试想办法让静态 class 具有常量字符串,当此 class 的值发生变化时不会强制重新编译。
我在这篇 highly voted comment 中读到:
... if you change a (const) value you must also recompile all assemblies dependent on your assembly defining the constants - therefore its often safer to go the readonly route.
所以我做了一个简短的实验来验证它是否属实。
我有 4 个项目:Program
、ProjectA
、ProjectB
和 ProjectC
。每个“ProjectX”都有一个 class“X”,而程序存储 main.
在 C 中我有一个 public const string someString = "some const string"
,它被 B
中的 public 方法引用,而 B
中又被 public 方法引用16=],A
的方法被Program.Main
调用。
我是否使 someString
成为 const
、static readonly
、getter 仅表达 属性 或仅 getter 属性 使用 属性 初始化程序,无论如何都会重建所有项目。
我真的可以拥有一个 static class 来保存只读字符串值,一旦它的值发生变化就不会将重新编译传播到所有依赖项目?
这里有两个不同的问题:
const
表示被视为编译时文字的值。 IE。每次使用它时,编译器都会在使用它的地方插入实际的文字值。如果您动态加载 dll,或使用不同于编译时所针对的 dll 版本,这可能是一个问题。详细了解 const vs static readonly。
您描述的问题是构建依赖系统。 IE。在进行增量构建时,它将重建所有修改过的项目以及依赖于将要重建的项目的所有项目。此行为与 const vs static readonly 无关。在代码文件中插入 space 足以使项目被视为已修改。
如果您只有四个项目,那么接受它可能是最简单的方法。如果这实际上是一个问题,您可以将这些值移动到配置文件中,这样就可以在不重新编译任何东西的情况下更改它们。
我正在尝试想办法让静态 class 具有常量字符串,当此 class 的值发生变化时不会强制重新编译。
我在这篇 highly voted comment 中读到:
... if you change a (const) value you must also recompile all assemblies dependent on your assembly defining the constants - therefore its often safer to go the readonly route.
所以我做了一个简短的实验来验证它是否属实。
我有 4 个项目:Program
、ProjectA
、ProjectB
和 ProjectC
。每个“ProjectX”都有一个 class“X”,而程序存储 main.
在 C 中我有一个 public const string someString = "some const string"
,它被 B
中的 public 方法引用,而 B
中又被 public 方法引用16=],A
的方法被Program.Main
调用。
我是否使 someString
成为 const
、static readonly
、getter 仅表达 属性 或仅 getter 属性 使用 属性 初始化程序,无论如何都会重建所有项目。
我真的可以拥有一个 static class 来保存只读字符串值,一旦它的值发生变化就不会将重新编译传播到所有依赖项目?
这里有两个不同的问题:
const
表示被视为编译时文字的值。 IE。每次使用它时,编译器都会在使用它的地方插入实际的文字值。如果您动态加载 dll,或使用不同于编译时所针对的 dll 版本,这可能是一个问题。详细了解 const vs static readonly。
您描述的问题是构建依赖系统。 IE。在进行增量构建时,它将重建所有修改过的项目以及依赖于将要重建的项目的所有项目。此行为与 const vs static readonly 无关。在代码文件中插入 space 足以使项目被视为已修改。
如果您只有四个项目,那么接受它可能是最简单的方法。如果这实际上是一个问题,您可以将这些值移动到配置文件中,这样就可以在不重新编译任何东西的情况下更改它们。