【发布时间】:2014-01-28 03:43:01
【问题描述】:
我们有一个项目被编译成一个名为 consts.dll 的 DLL,其中包含以下内容:
public static class Consts
{
public const string a = "a";
public const string b = "b";
public const string c = "c";
}
我们有多个此类项目,每个项目都编译成同名的 DLL (consts.dll),我们根据需要替换它们。 我们还有另一个使用这些常量的类:
public class ConstsUser
{
string f() { return Consts.a; }
}
不幸的是,Consts.a 被优化为 "a" ,所以即使我们替换 Consts.dll 实现,我们仍然得到 "a" 而不是正确的值,我们需要重新编译 ConstsUser。有没有办法阻止优化器用它们的值替换 const 变量?
【问题讨论】:
-
请注意,进行此替换的不是优化器,这只是 C# 编译器在所有实例中的行为
-
类的每个公共成员,包括常量,都是该类接口的一部分。常量是特殊的,因为不仅它们的名称,而且它们的值也是接口的一部分。当你改变一个类的接口时,你必须重新编译它的所有依赖代码。更改公共
const成员的值是一项重大更改。您不能换掉 DLL,并期望一切都能正常工作,原因与您期望更改类名或其中一个成员的参数类型会触发错误的原因相同。 -
也许你的常数毕竟不是那么常数?说真的,仅将 const 用于实际恒定的事物。 Pi 就是一个很好的例子。
-
如果您的常量不是常量,请不要使用 const... 实际上,它们的值甚至可能不在代码中;它们应该在配置文件中。
标签: c# optimization