[英]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#代碼庫和廣泛的預處理器指令用法。 手動重構看起來像是一個漫長而無聊的猴子工作。 我由於unifdef , sunifdef和coan C工具而失敗,因為#region等一些C#語法細節。 從長遠來看,我已經使自己的工具變得不確定 。 它使用regexp解析預處理器指令,並使用sympy python庫簡化邏輯表達式。 在1000萬行的大型代碼庫上,它對我很有用。
我知道這三種設備類型沒有通用的基類或接口。 您不能只在運行時選擇三個變量之一並使用基本類型鍵入所有變量。
以下是一些選擇:
dynamic
。 這可以通過減少工具幫助(減少自動完成,減少手頭的文檔,減少快速的靜態錯誤檢查)的代價來快速解決。 使用#if
解決此問題非常罕見。 這是有問題的,因為現在甚至可以確保代碼編譯的測試量增加了兩倍。 您還需要多個二進制文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.