首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于常量的条件编译?

基于常量的条件编译?
EN

Stack Overflow用户
提问于 2020-06-09 20:48:11
回答 1查看 292关注 0票数 1

是否可以基于类中定义的常量值有条件地编译类和方法,例如,我希望有这样的东西。

代码语言:javascript
复制
public enum BuildMode : int {
    One = 1,
    Two = 2,
    Three = 3
}

public class BuildConfig {
    // I will change this line, based on what build I want
    public const BuildMode Mode = BuildMode.One;
}

public class SomeClass {
   #if BuildConfig.Mode == BuildMode.One
       public void SomeMethod() { /* Implementation one */ }
   #elif BuildConfig.Mode == BuildMode.Two
       public void SomeMethod() { /* Implementation two */ }
   #elif BuildConfig.Mode == BuildMode.Three
       public void SomeMethod() { /* Implementation three */ }
   #endif
}

显然,我知道条件编译是如何在C#中完成的,一般来说,我希望基于类中的常量值来进行条件编译,而不是基于预处理器的定义。知道很多编译时的东西都使用常量(比如Guid属性),有没有办法根据类常量有条件地编译方法/类呢?有一个条件属性,但它似乎也只适用于定义。

我有一个复杂的项目,有多种构建模式,我想让其他人更容易构建我的项目。例如,我需要在一个设置上有3种不同的模式(可能更多),在另一种设置上有2-3种不同的模式。所以为了让其他人更容易编译我的项目,我需要3*3=9个不同的预处理器定义和9个不同的csproj文件。如果我需要添加更多的设置/模式/常量,那么这个故事就不能真正扩展。对于一个将要编译我的代码的人来说,它可能会变得非常混乱,但是之前没有见过它。至少有了常量,编译器会检查它的类型,这样就不会有太多的可能把事情搞砸。

显然,我可以构建代码来支持配置常量的所有变体,并在运行时基于它们调用代码,但我希望进行优化,使未使用的代码不会被编译进来。

EN

回答 1

Stack Overflow用户

发布于 2020-06-09 21:32:00

不是的-

C#不会计算#if preprocessor directive中的表达式-它只会查看符号是否已定义:

当C#编译器遇到#if指令,最后是#endif指令时,仅当指定的符号定义为时,它才会编译指令之间的代码。与C和C++不同,您不能将数值赋给符号。C#中的#if语句是布尔型的,它只测试符号是否已定义。

(已添加强调)

所以做你想做的事情的正确方法是:

代码语言:javascript
复制
public class SomeClass {
   #if BUILD_MODE_ONE
       public void SomeMethod() { /* Implementation one */ }
   #elif BUILD_MODE_TWO
       public void SomeMethod() { /* Implementation two */ }
   #elif BUILD_MODE_THREE
       public void SomeMethod() { /* Implementation three */ }
   #endif
}

其中符号可以在该代码文件中定义,也可以通过CSC.EXE的命令行参数定义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62282998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档