我正在编写一个使用外部数据的程序,这是我无法控制的。这些数据随着时间的推移而变化,但我希望我的程序与它的各种版本兼容。在其他语言中,我使用#define来指定版本,而不是使用#if来为指定版本执行必要的操作。像
#if VERSION >= 5
...
#endif
我知道这在C#中是不可能的,因为它只允许定义符号,但不能为它们分配内容。所以我想知道,实现这一目标的最佳方法是什么?我可以定义像VERSION_5这样的东西,但我宁愿能够检查特定版本,特别是范围,这会像这样烦人。我能想到的下一个最好的东西是const,但是必须在运行时检查它,这可能会减慢一点点。我不确定它在我的项目中是否会引人注意,但我很担心。
在C#中有一种标准的方法吗?什么是最好的方式?
答案 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)
我正在编写一个使用外部数据的程序,我不能这样做 控制。
因此,虽然它是服务器应用程序,但您可以接收使用任何版本格式化的数据,然后,您必须支持所有版本。结果,您不应该通过指令进行编译时决策,您应该分析数据运行时以获得支持的模式,并在识别模式后继续进行适当的处理。例如,为不同版本运行不同的线程,然后识别器应该将识别的数据并行传递给负责任的合适线程,并且还会使未知数据失败!