2013-04-07 49 views
0

我有一个应用程序,我使用编译器开关来控制是否包含大块代码。认为自动变速器或手动变速器的汽车。 在调试模式下工作正常,但在释放模式下,它看起来像自动变速箱和手动变速箱都编译,所以车不太好驱动...发布模式下的C#编译器开关

所以我错了试图获得选项控制功能编译器开关?

更多详细信息: 我对编译器开关的理解是有缺陷的。在下面的评论

简单的项目。(不太擅长驾驶的StackOverflow)

继续上面的类比,将(WinForm的)项目是用手动变速器建。它使用安装项目以调试模式部署。 (错误)。

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

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

经过多年的磨合,我决定应该发布它。那是当我注意到这个问题时。

请求的简单示例(谢谢)告诉我,它不是两个正在编译的块,而是#else中的块。即释放构建将开关视为关闭。

所以除非我错过了一些答案是不言而喻的。不要将编译器开关用于部署选项。

+1

很难理解你在说什么 - 你能发表一些简短的代码示例来说明这一点吗? – Oded 2013-04-07 20:36:06

+0

嗯,所以你基本上失去了#ifdefs的轨道?那么你使用的太多了。 – 2013-04-07 20:37:42

+0

简单示例显示在发布版本中编译器开关被忽略。我原来的帖子里写错了。所以除非我误解。不要为项目选项使用编译器开关。 public partial class Form1:Form { public Form1() { InitializeComponent(); Display(); } 私人无效显示() { 的#if(是myswitch) 的MessageBox。显示(“MySwitch on”); #else MessageBox.Show(“MySwitch off”); #endif } – 2013-04-09 00:06:54

回答

0

我建议你改用构图并利用面向对象。有两个班级,一个为AutoTransmission,另一个为ManualTransmission。每个人都将从基类派生Transmission然后,您可以在创建使用其中一种传输的对象时使用任何一种。

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

相关问题