【问题标题】:How to avoid recompiling assemblies when changing constant values? (C#)更改常量值时如何避免重新编译程序集? (C#)
【发布时间】:2020-11-04 11:51:19
【问题描述】:

我正在尝试找到一种方法来创建一个带有常量字符串的静态类,当此类的值发生变化时,它不会强制重新编译。

我在highly voted comment 中读到:

...如果您更改 (const) 值,您还必须重新编译所有依赖于定义常量的程序集的程序集 - 因此走只读路线通常更安全。

所以我做了一个简短的实验来检查它是否属实。

我有 4 个项目:Program、ProjectA、ProjectB 和 ProjectC。每个“ProjectX”都有一个类“X”,而程序存储main。

在 C 中我有一个public const string someString = "some const string",它被B 中的公共方法引用,而A 中的公共方法又引用了它,A 的方法被@987654331 调用@。

无论我将someString 设为const、static readonly、仅使用getter 表达式体属性还是仅使用属性初始化器的getter 属性,无论如何都会重建所有项目 .

那么,我是否可以拥有一个 static 类来保存只读字符串值,一旦其值发生更改,它就不会将重新编译传播到所有相关项目?

【问题讨论】:

  • 构建系统着眼于依赖关系,而不是语义。因此,如果项目 A 被重建并且项目 B 引用它,它也将被重建,即使它也可以在没有重建的情况下工作。
  • 那么从开发人员的角度来看,它是否是 const 又有什么关系呢?无论如何,您都会重新编译所有内容。
  • 这些项目可能不会一起构建。想想一个库 A 和一个使用它的第三方应用程序。然后,您要避免库中的任何重大更改迫使其他开发人员重新构建。
  • 好的,所以在 3rd 方库的情况下这是有道理的,但是当使用具有项目之间引用的整体解决方案时?使用这些带有大量const strings 的大型静态类仍然是常见的做法,还是人们使用其他解决方案(例如资源文件)?

标签: c# .net msbuild constants


【解决方案1】:

这里有两个不同的问题:

const 表示被视为编译时文字的值。 IE。每次使用它时,编译器都会在使用它的地方插入实际的文字值。如果您动态加载 dll,或者使用其他版本的 dll,而不是针对它进行编译,这可能会成为问题。阅读有关const vs static readonly 的更多信息。

您描述的问题是构建依赖系统。 IE。在进行增量构建时,它将重建所有修改的项目以及依赖于将要重建的项目的所有项目。此行为与 const vs static readonly 无关。在代码文件中插入一个空格就足以让项目被视为已修改。

如果您只有四个项目,那么最简单的方法可能就是使用它。如果这确实是一个问题,您可以将这些值移动到配置文件中,这样就可以在不重新编译任何内容的情况下更改它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    相关资源
    最近更新 更多