是否比C#中的预处理器指令(#if等)更好?

时间:2019-07-09 19:28:47

标签: c# preprocessor-directive

大多数这种类型的问题都在寻求改变程序的行为(可以在运行时确定的事情)或希望直接处理调试打印。这有点不同。

我有依赖于外围设备的代码(例如读卡器)。有时我不使用它,这意味着该库不存在。 (我很好,因为“库”原来意味着要安装2GB的软件套件)。删除库时,无法打开设备。如果无法打开设备,则无法创建使用该设备的类成员。由于类不起作用,因此无法在代码中调用其方法。因此,我不能选择不执行它。我需要它消失,因为没有库就无法编译。

诸如#if之类的预处理器指令,也许还可以;但是这些内容显示在多个文件中,这意味着在每个文件的顶部独立维护一个#define。我来自一个更简单的地方(意思是C),可以使用一个头文件来控制它。我注意到C#对#define颇为敌对(无论标签是否存在;不允许使用常量或计算),这让我认为还有另一种方法。

您如何处理?

---跟进---

我确实阅读了“重复的” Q / A,并且对我要处理的内容有相当不错的了解。我在最初的搜索中没有找到这些问题,但是有时候就是这样。

@Amy建议在#define顶部是“不是如何完成”,而是“将其放在命令行上”。因此,(如果我意识到我们坚持使用这种机制),讨论可能会着眼于实现这种情况的方式。一个人不只是掉到一个终端上去做。它发生为“ IDE功能”或“ IDE hacks”。

@Alexei Levenkov问我真正想要的是什么。我真的想(a)不会出现编译错误,并且(b)通过有选择地省略代码来做到这一点。并且,找到与我建议的方式等效的C#。 我一直没有使用VS或C#的事实解决了更多的限制。所以我比你们知道的要少得多。考虑到我从最后一个人那里得到了代码,并且不得不处理我所看到的内容,所以我不想在我之后成立这个人,而不得不弄清楚我可能为使它起作用而做了哪些“有趣的”事情。因此,诸如手动编辑项目文件之类的事情可能会起作用,但也会引起线下的混乱。

@埃里克·利珀特(Eric Lippert)表示“敌对”确实是“明智的”。我的舌头可能太深了。 VS似乎在告诉我我做错了,因此我感觉到我根本不知道有“正确的方法”。至于支持2GB的应用程序,我将转到各种计算机并拉下存储库并尝试一些操作,因此此“开销”希望随其一起传播。如果通过手机链接进行下载,那会更糟。而且,如果我构建了包含所有内容的应用程序,则最终用户需要先安装该软件套件,然后程序才能运行。从理论上讲,他们可能需要购买软件。如果我给您发送了一个井字游戏,并告诉您直到安装Oracle后它才能运行,否则您可能会遗忘整个事情。

我考虑了“接口残存”的想法,但是进入类的钩子似乎比我想处理的要多。另外,我不知道这些是做什么的,因此我必须对它们有所了解才能“伪造”它们。

最后,我决定我们仍在很大程度上使用#if方案来完成此操作,而我想象中的替代功能可能并不存在。我正在使用@Jim G.引用的项目文件中的规定,因为该规定可以完成工作,并且效果不理想。够了。

1 个答案:

答案 0 :(得分:1)

@BJ Safdie said here

  • 在“编译属性”或“构建”选项中进行设置。
  • 通过右键单击项目并选择来获得构建选项 菜单中的属性。

Project Build Options