如何在更改常量值时避免重新编译程序集? (C#)

32 浏览
0 Comments

如何在更改常量值时避免重新编译程序集? (C#)

我正在尝试找到一种方法,可以创建一个静态类,其中包含常量字符串,而当此类的值发生更改时,不会强制重新编译。\n我在这个高票评论中读到:\n

\n...如果更改了(const)值,您还必须重新编译依赖于定义常量的程序集的所有程序集 - 因此,通常更安全的方法是使用只读方法。\n

\n所以我进行了一个简短的实验来验证它是否正确。\n我有4个项目:ProgramProjectAProjectBProjectC。每个 \"ProjectX\" 都有一个名为 \"X\" 的单个类,而程序则存储在main中。\n在类C中,我有一个单独的public const string someString = \"some const string\",它被B中的一个公共方法引用,而B又被A中的一个公共方法引用,A的方法被Program.Main调用。\n无论我将someString设置为conststatic readonly,只读表达式主体属性或具有属性初始化程序的只读属性,无论如何,所有项目都会重新构建。\n所以,是否真的可以有一个静态类,其中包含只读字符串值,一旦其值更改,就不会传播重新编译到所有依赖项目中呢?

0
0 Comments

当我们在更改常量值时,避免重新编译程序集的问题有两个不同的方面。

首先,使用const关键字意味着该值被视为编译时字面量。也就是说,每次使用它时,编译器将在使用它的地方插入实际的字面量值。这可能会导致问题,如果我们动态加载dll,或者使用与其编译时版本不同的dll。可以阅读更多关于conststatic readonly之间的区别的内容。

其次,我们面临的问题是构建依赖系统。也就是说,在进行增量构建时,它将重新构建所有修改过的项目,以及所有依赖于将被重新构建的项目的项目。这个行为与conststatic readonly无关。只需在代码文件中插入一个空格即可被认为项目已被修改。

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

0