2013-04-07 43 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禁用的塊將不會被處理,並且在您更改編譯器選項時可能無法生成。

相關問題