2012-09-11 47 views
0

我正在編寫一個程序,它與外部數據無法控制。這些數據會隨着時間而改變,但我希望我的程序能夠與其各種版本兼容。在其他語言中,我會使用#define指定版本,並使用#if來爲指定版本執行必要的操作。像版本相關代碼

#if VERSION >= 5 
    ... 
#endif 

我知道這是不可能在C#中,因爲它只允許定義符號,但不能分配給他們的東西。所以我想知道,完成這個最好的方法是什麼?我可以定義VERSION_5之類的東西,但是我寧願能夠檢查特定的版本,尤其是範圍,這會很煩人。我能想到的下一個最好的東西是const,但是這必須在運行時檢查,這可能會使事情稍微減慢一點。我不確定它在我的項目中是否會引人注目,但我很擔心。

有沒有一個標準的方式來做到這一點在C#中?最好的方法是什麼?

+2

版本合約.... –

+2

爲什麼要使用預處理器?難道你不能在運行時使用普通的'if(version> = 5)'條件語句做出這樣的決定嗎? –

+0

就像我說過的,我有點擔心它可能會對性能產生影響。這是一個服務器應用程序,幾乎每個傳入消息的結構都將取決於版本。 – Mars

回答

1

我會爲數據處理創建一個或多個接口。每個接口都可能實現多次,每個版本範圍一次。這些接口實現不是被注入到處理數據的類中。

像這樣:

public interface IDataProcessor 
{ 
    void Process(Data data); 
    bool SupportsVersion(int version); 
} 

在數據處理程序類:

foreach(var dataProcessor in _dataProcessors) 
{ 
    if(dataProcessor.SupportsVersion(versionOfCurrentData)) 
    { 
     dataProcessor.Process(data); 
    } 
} 
+1

我會採用類似的方法使用工廠模式。 – TGlatzer

0

這個例子是.NET版本相關的。 對於一些項目,他們使用

#if NET_2_0 
... 
#endif 
#if NET_3_5 
... 
#endif 
#if NET_4_0 
... 
#endif 
#if NET_4_5 
... 
#endif 

在生命週期的.NET 1.1的結束,他們只是刪除NET_2_0條件句,以保持較少的條件句。

在對.NET 4.5的項目文件,定義NET_2_0,NET_3_5,NET_4_0,NET_4_5

在項目文件.NET 4.0,定義NET_2_0,NET_3_5,NET_4_0

在項目文件.NET 3.5,限定NET_2_0,NET_3_5

在用於.NET 2.0項目文件中,定義NET_2_0

在項目文件.NET 1.1,沒有定義符號

0

我在寫一個程序,它與外部數據一起工作,我不能控制 。

因此,儘管它是一個服務器應用程序,你可能會收到與任何版本格式化的數據,那麼,你必須支持所有。結果,你不應該通過指令做出編譯時間的決定,你應該分析受支持模式的數據運行時間,並在識別模式之後繼續適當的處理。例如,針對不同的版本運行不同的線程,然後識別器應該將識別的數據並行傳遞給負責的合適線程,並且還會使未知數據失敗!