有没有比 C# 中的预处理器指令(#if 等)更好的东西?

Is there something better than preprocessor directives (#if, etc) in C#?

大多数此类问题都在寻求改变程序行为(可以在 运行 时间决定的事情)或想直接处理调试打印。这个有点不一样。

我的代码依赖于外围设备(比如卡 reader)。有时我不使用它,这意味着图书馆不存在。 (而且我很友善,因为 "library" 原来意味着安装 2GB 的软件套件)。当我删除库时,我无法打开设备。如果无法打开设备,则无法创建使用它的 class 成员。由于 class 不起作用,我无法从代码中调用它的方法。所以,我不能选择不执行;我需要它消失,因为没有库它就无法编译。

预处理器指令,如 #if 和所有这些都可以,也许吧;但是这些东西出现在多个文件中,这意味着在每个文件的顶部独立维护一个#define。我来自一个更简单的地方(意思是 C),在那里可以使用一个头文件来控制它。我注意到 C# 对 #define 相当敌视(标签存在与否;不允许常量或计算),这让我认为还有另一种方法。

你是怎么处理的?

---跟进---

我确实阅读了 "duplicate" Q/A 的文章,并且对我正在处理的内容有一个很好的了解。我在最初的搜索中没有找到这些问题,但有时就是这样。

@Amy 建议顶部的 #define 是 "not how it's done" 而不是 "put it on the command line"。所以,(如果我意识到我们坚持使用这种机制)讨论可能会转向研究如何实现这一点。一个人不会简单地下降到终端并这样做。它发生为 "IDE features" 或 "IDE hacks"。

@Alexei Levenkov 问我真正想要什么。我真的希望 (a) 不会出现编译错误,并且 (b) 通过有选择地省略代码来做到这一点。并且,找到与我建议的方式等效的 C#。 由于我已经很长时间没有使用 VS 或 C#,因此解决了一些更多的限制。所以我知道的比你们少得多。考虑到我从最后一个人那里得到了代码并且必须处理我所看到的,我不想设置我之后的人必须弄清楚我可能做了什么 "interesting" 事情才能让它工作.因此,诸如手动编辑项目文件之类的事情可能会奏效,但也会引起恐慌。

@Eric Lippert 建议 "hostile" 确实是 "sensible"。在那个人身上,我的舌头可能太深入我的脸颊了。 VS 似乎在告诉我我做错了,所以我感觉到有一个 "right way" 我根本不知道。至于2GB的配套应用,我会去各种电脑拉下仓库试试看,所以这个"overhead"想和它一起传播。如果我通过我的 phone 链接来进行下载,那就更糟了。如果我构建包含所有内容的应用程序,则最终用户需要在程序 运行 之前安装该软件套件。理论上,他们可能需要购买软件。如果我给你发了一个井字游戏,并告诉你在你安装 Oracle 之前它不会 运行,你可能会放弃整个游戏。

我考虑了 "stub out the interface" 的想法,但 class 中似乎有比我想处理的更多的钩子。另外,我不知道这些东西是干什么的,所以我必须对它们有所了解才能 "fake" 它们。

最后我决定我们仍然主要使用#if 方案来完成这项工作,而我想象的替代功能可能存在,但不存在。我正在使用@Jim G. 引用的项目文件中的规定,因为它完成了工作并且只有一点点不完美。够用了。

作为@BJ Safdie said here:

  • 在您的编译属性或构建选项中设置它们。
  • 您可以通过 right-clicking 项目并选择 菜单中的属性。