2012-09-11 46 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

我在写一个程序,它与外部数据一起工作,我不能控制 。

因此,尽管它是一个服务器应用程序,你可能会收到与任何版本格式化的数据,那么,你必须支持所有。结果,你不应该通过指令做出编译时间的决定,你应该分析受支持模式的数据运行时间,并在识别模式之后继续适当的处理。例如,针对不同的版本运行不同的线程,然后识别器应该将识别的数据并行传递给负责的合适线程,并且还会使未知数据失败!