Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#编译器在释放模式下切换_C# - Fatal编程技术网

C#编译器在释放模式下切换

C#编译器在释放模式下切换,c#,C#,我有一个应用程序,使用编译器开关控制是否包含大块代码。想想自动变速器或手动变速器的汽车。 在调试模式下工作正常,但在发布模式下,似乎自动变速器和手动变速器都已编译,因此汽车的驾驶性能不太好 那么,我试图从编译器开关中获取选项控制功能是错误的吗 更多详情: 我对编译器开关的理解是有缺陷的 下面评论中的简单项目。(不太擅长驱动堆栈溢出) 为了继续进行类比,(Winform)项目是使用手动变速器构建的。它是使用安装项目在调试模式下部署的。(错误) 几年后,需要自动变速器。(没有共同性来产生基类)。 当

我有一个应用程序,使用编译器开关控制是否包含大块代码。想想自动变速器或手动变速器的汽车。 在调试模式下工作正常,但在发布模式下,似乎自动变速器和手动变速器都已编译,因此汽车的驾驶性能不太好

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

更多详情: 我对编译器开关的理解是有缺陷的

下面评论中的简单项目。(不太擅长驱动堆栈溢出)

为了继续进行类比,(Winform)项目是使用手动变速器构建的。它是使用安装项目在调试模式下部署的。(错误)

几年后,需要自动变速器。(没有共同性来产生基类)。 当时的想法是,有一天可能再次需要手动变速器)

似乎编译器开关是决定使用哪个代码块的好主意。 自动传输版本再次以调试模式部署

在运行了几年之后,我决定将其发布。就在那时,我注意到了这个问题

这个简单的示例(谢谢)告诉我,编译的不是两个块,而是#else中的块。i、 e.释放将开关视为关闭


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

我建议您改用组合,并使用面向对象。有两类,一类用于自动变速箱,另一类用于手动变速箱。每一个都将派生自基类
传输
,然后在创建使用其中一个传输的对象时,您可以根据需要使用其中一个


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

很难理解您所说的内容-您可以发布一些简短的代码示例来说明这一点吗?呃,所以你基本上忘记了IFDEF?这个简单的例子显示编译器开关在发布版本中被忽略了。我在原来的帖子里把它搞错了。除非我误解了。不要对项目选项使用编译器开关。公共部分类Form1:Form{public Form1(){InitializeComponent();Display()}private void Display(){#if(MySwitch)MessageBox.Show(“MySwitch on”);#else MessageBox.Show(“MySwitch off”);#endif}