簡體   English   中英

在C#中刪除預處理器分支

[英]Removing preprocessor branching in C#

我正在重構一些源代碼,並獲得了刪除預處理器編譯的任務。 我現在已經在互聯網上搜索了幾天,但是還沒有找到如何執行此操作的好主意。 我對C#也很陌生。

因此出現了問題,每個設備都有不同的接口(類),並且“ ControlLogic”類當時只需要使用其中一個即可。 在程序運行時選擇設備。 到目前為止,“ device”變量(也在全球范圍內使用)已在很多地方使用,並且考慮到重命名對我來說沒有意義。 同樣,所有設備接口(類)都派生自基類,但是接口類確實為它們實現了不同的方法。

public class ControlLogic
{
#if FIRST_DEVICE
        public FirstDeviceInterace device = null;
#elif SECOND_DEVICE
        public SecondDeviceInterface device = null;
#elif THIRD_DEVICE
        public ThirdDeviceInterface device = null;
#endif

// One example method
public void startDevice()
{
    if (device != null)
    {
#if (FIRST_DEVICE || SECOND_DEVICE)
         device.startDevice();
#endif

#if THIRD_DEVICE
         device.startThirdDevice();
#endif
     }
}

// More code.....
}

那么刪除預處理器編譯的最佳方法是什么?

幾個月前,我面臨着類似的任務:龐大的C#代碼庫和廣泛的預處理器指令用法。 手動重構看起來像是一個漫長而無聊的猴子工作。 我由於unifdefsunifdefcoan C工具而失敗,因為#region等一些C#語法細節。 從長遠來看,我已經使自己的工具變得不確定 它使用regexp解析預處理器指令,並使用sympy python庫簡化邏輯表達式。 在1000萬行的大型代碼庫上,它對我很有用。

我知道這三種設備類型沒有通用的基類或接口。 您不能只在運行時選擇三個變量之一並使用基本類型鍵入所有變量。

以下是一些選擇:

  1. 找到一種常見的基本類型的方法
  2. 如果您不能修改類(或者由於某些原因而不合適),請編寫包裝器 該包裝器可以具有您喜歡的任何結構。 每個設備類可以有一個具有通用基本類型的包裝器。
  3. 使用dynamic 這可以通過減少工具幫助(減少自動完成,減少手頭的文檔,減少快速的靜態錯誤檢查)的代價來快速解決。

使用#if解決此問題非常罕見。 這是有問題的,因為現在甚至可以確保代碼編譯的測試量增加了兩倍。 您還需要多個二進制文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM