【问题标题】:Version dependent code版本相关代码
【发布时间】:2012-09-11 08:07:05
【问题描述】:

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

#if VERSION >= 5
    ...
#endif

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

在 C# 中是否有标准的方法来执行此操作?最好的方法是什么?

【问题讨论】:

  • 版本化合约....
  • 为什么要使用预处理器?您不能在运行时使用普通的if (version >= 5) 条件语句做出这样的决定吗?
  • 就像我说的,我有点担心它可能会在某些时候影响性能。它是一个服务器应用程序,几乎每个传入消息的结构都将依赖于版本。
  • 无需担心。此外,我真的不明白它如何与预处理器指令一起使用,因为您需要在 compile 时指定 VERSION 符号,但消息只会在运行时到达您...跨度>
  • 消息具有不同的结构,具体取决于版本。我会为版本 5 编译程序,一旦它运行,只有来自该版本的消息会被正确解释。不是理想的解决方案,但我已经习惯了^^但是如果你说没什么好担心的,我可能会重新考虑const,甚至阅读客户端的版本。

标签: c# c-preprocessor


【解决方案1】:

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

类似这样的:

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

在数据处理类中:

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

【讨论】:

  • 我会采用工厂模式的类似方法。
【解决方案2】:

此示例取决于 .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 的项目文件中,没有定义符号

【讨论】:

    【解决方案3】:

    我正在编写一个处理外部数据的程序,但我不能 控制。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 2023-03-03
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 2023-01-08
      相关资源
      最近更新 更多