0

我正在编写一个处理我无法控制的外部数据的程序。这些数据会随着时间而变化,但我希望我的程序与它的各种版本兼容。在其他语言中,我会使用#define 来指定版本,而不是使用#if 来为指定的版本做必要的事情。喜欢

#if VERSION >= 5
    ...
#endif

我知道这在 C# 中是不可能的,因为它只允许定义符号,但不能为它们分配一些东西。所以我想知道,实现这一目标的最佳方法是什么?我可以定义诸如 VERSION_5 之类的东西,但我宁愿能够检查特定版本,尤其是range,这样会很烦人。我能想到的下一个最好的事情是 const,但这必须在运行时进行检查,这可能会稍微减慢速度。我不确定它是否会在我的项目中引起注意,但我很担心。

在 C# 中有没有标准的方法来做到这一点?最好的方法是什么?

4

3 回答 3

1

我会为数据处理创建一个或多个接口。每个接口都可能实现多次,每个版本范围一次。这些接口实现会被注入到处理数据的类中。

像这样的东西:

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

在数据处理程序类中:

foreach(var dataProcessor in _dataProcessors)
{
    if(dataProcessor.SupportsVersion(versionOfCurrentData))
    {
        dataProcessor.Process(data);
    }
}
于 2012-09-11T08:14:59.197 回答
0

我正在编写一个处理我无法控制的外部数据的程序。

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

于 2012-09-11T08:36:52.830 回答
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 的项目文件中,没有定义符号

于 2012-09-11T08:35:00.617 回答