如何在更改常量值时避免重新编译程序集? (C#)
如何在更改常量值时避免重新编译程序集? (C#)
我正在尝试找到一种方法,可以创建一个静态类,其中包含常量字符串,而当此类的值发生更改时,不会强制重新编译。\n我在这个高票评论中读到:\n
\n...如果更改了(const)值,您还必须重新编译依赖于定义常量的程序集的所有程序集 - 因此,通常更安全的方法是使用只读方法。\n
\n所以我进行了一个简短的实验来验证它是否正确。\n我有4个项目:Program
,ProjectA
,ProjectB
和ProjectC
。每个 \"ProjectX\" 都有一个名为 \"X\" 的单个类,而程序则存储在main中。\n在类C中,我有一个单独的public const string someString = \"some const string\"
,它被B
中的一个公共方法引用,而B
又被A
中的一个公共方法引用,A
的方法被Program.Main
调用。\n无论我将someString
设置为const
,static readonly
,只读表达式主体属性或具有属性初始化程序的只读属性,无论如何,所有项目都会重新构建。\n所以,是否真的可以有一个静态类,其中包含只读字符串值,一旦其值更改,就不会传播重新编译到所有依赖项目中呢?
当我们在更改常量值时,避免重新编译程序集的问题有两个不同的方面。
首先,使用const
关键字意味着该值被视为编译时字面量。也就是说,每次使用它时,编译器将在使用它的地方插入实际的字面量值。这可能会导致问题,如果我们动态加载dll,或者使用与其编译时版本不同的dll。可以阅读更多关于const
与static readonly
之间的区别的内容。
其次,我们面临的问题是构建依赖系统。也就是说,在进行增量构建时,它将重新构建所有修改过的项目,以及所有依赖于将被重新构建的项目的项目。这个行为与const
和static readonly
无关。只需在代码文件中插入一个空格即可被认为项目已被修改。
如果你只有四个项目,那么最简单的方法可能是接受这个问题。如果它确实是一个问题,你可以将这些值移到一个配置文件中,这样就可以在不重新编译任何内容的情况下进行更改。