c# 有常量的编译器计算机值

问题描述 投票:0回答:2

当我真的不知道这叫什么时,我很难弄清楚这是否可能。

我有一个 APIKey(可以随着不同的版本而改变),我们还有另一个字段可以将该 APIKey 转换为对网络更加友好。 这是网络友好的,我想让编译器计算。

目前我们正在重新计算每次调用 webapi 的值。 我可以轻松地定义一个 const 并放入它的网络友好版本,但我想要更花哨一点并提供更少的维护。

我想要的就是这样的。

public class WebSearch{
  private const string ApiKey="jsdfjsd90234092j3_%sss";
  private const string WebFriendlyKey=#Compiler(ApiKey.Replace("-","+"));
}

WebFriendlyKey 由编译器计算。

c# constants
2个回答
8
投票

C# 4 规范的第 7.19 节列出了编译器将代表您对常量执行的每个操作。字符串替换不是其中之一。

但是,您可以使用 readonly static 字段,或具有静态属性的只读静态字段,如果尚未计算该值,则计算该值;如果已计算该值,则获取该值。在这种情况下,编译器不会进行编译,但每个应用程序域只会执行一次计算。

也就是说,我同意亨克的观点。你这里有更大的鱼要炸。担心实际影响正确性或性能的事情。


2
投票

我不相信当前的 C# 编译器可以做到这一点。 也许随着新的模块化编译器的出现(Roslyn)。

您现在可以做的就是每次进程启动时计算一次 WebFriendlyKey,并在进程的整个生命周期内存储它,我向您保证,从性能角度来看,这与常量一样好:

public class WebSearch{
  private const string ApiKey="jsdfjsd90234092j3_%sss";

  // This guy will only run once per AppDomain
  private static readonly string WebFriendlyKey = ApiKey.Replace("-","+");
}
© www.soinside.com 2019 - 2024. All rights reserved.