发布模式下的C#编译器开关

时间:2013-04-07 20:34:52

标签: c#

我有一个应用程序,我使用编译器开关来控制是否包含大块代码。想想用自动变速器或手动变速器的车。 在调试模式下正常工作,但在发布模式下,它看起来像是自动传输和手动传输都被编译,因此汽车驱动得不太好......

我试图从编译器开关中获取选项控制功能是错误的吗?

更多细节: 我对编译器开关的理解存在缺陷。

以下评论中的简单项目。(不太擅长驾驶StackOverFlow)

继续比喻,(Winform)项目是用手动变速器建造的。它使用安装项目以调试模式部署。 (错误)。

几年后需要自动传输。 (没有产生基类的共性)。 想到的是,有一天可能需要再次手动传输。

看起来像编译器开关是一个好主意,决定使用哪个代码块。 自动传输版本再次以调试模式部署。

经过多年的跑步后,我决定将它发布。就在那时我注意到了这个问题。

要求的简单示例(谢谢)向我展示了不是两个块都被编译,只是#else中的块。即版本构建将开关视为关闭。

因此,除非我遗漏了某些答案,否则答案是不言而喻的。不要将编译器开关用于部署选项。

1 个答案:

答案 0 :(得分:0)

我建议您使用合成而使用面向对象。有两个类,一个用于AutoTransmission,另一个用于ManualTransmission。每个都将派生自基类Transmission然后,当您创建使用其中一个传输的对象时,您可以根据需要使用其中任何一个。

然后,当您创建使用Transmission的对象时,只需实例化您需要的任何传输。这可以在config中定义,也可以是编译器常量。但是,我建议不要使用编译器常量,因为在执行自动重构时,#ifdef禁用的块将不会被处理,并且在您更改编译器选项时可能无法构建。