版本相关代码

时间:2012-09-11 08:07:06

标签: c# c-preprocessor

我正在编写一个使用外部数据的程序,这是我无法控制的。这些数据随着时间的推移而变化,但我希望我的程序与它的各种版本兼容。在其他语言中,我使用#define来指定版本,而不是使用#if来为指定版本执行必要的操作。像

#if VERSION >= 5
    ...
#endif

我知道这在C#中是不可能的,因为它只允许定义符号,但不能为它们分配内容。所以我想知道,实现这一目标的最佳方法是什么?我可以定义像VERSION_5这样的东西,但我宁愿能够检查特定版本,特别是范围,这会像这样烦人。我能想到的下一个最好的东西是const,但是必须在运行时检查它,这可能会减慢一点点。我不确定它在我的项目中是否会引人注意,但我很担心。

在C#中有一种标准的方法吗?什么是最好的方式?

3 个答案:

答案 0 :(得分: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 :(得分: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的项目文件中,没有定义符号

答案 2 :(得分:0)

  

我正在编写一个使用外部数据的程序,我不能这样做   控制。

因此,虽然它是服务器应用程序,但您可以接收使用任何版本格式化的数据,然后,您必须支持所有版本。结果,您不应该通过指令进行编译时决策,您应该分析数据运行时以获得支持的模式,并在识别模式后继续进行适当的处​​理。例如,为不同版本运行不同的线程,然后识别器应该将识别的数据并行传递给负责任的合适线程,并且还会使未知数据失败!