[英]Removing preprocessor branching in C#
我正在重构一些源代码,并获得了删除预处理器编译的任务。 我现在已经在互联网上搜索了几天,但是还没有找到如何执行此操作的好主意。 我对C#也很陌生。
因此出现了问题,每个设备都有不同的接口(类),并且“ ControlLogic”类当时只需要使用其中一个即可。 在程序运行时选择设备。 到目前为止,“ device”变量(也在全球范围内使用)已在很多地方使用,并且考虑到重命名对我来说没有意义。 同样,所有设备接口(类)都派生自基类,但是接口类确实为它们实现了不同的方法。
public class ControlLogic
{
#if FIRST_DEVICE
public FirstDeviceInterace device = null;
#elif SECOND_DEVICE
public SecondDeviceInterface device = null;
#elif THIRD_DEVICE
public ThirdDeviceInterface device = null;
#endif
// One example method
public void startDevice()
{
if (device != null)
{
#if (FIRST_DEVICE || SECOND_DEVICE)
device.startDevice();
#endif
#if THIRD_DEVICE
device.startThirdDevice();
#endif
}
}
// More code.....
}
那么删除预处理器编译的最佳方法是什么?
几个月前,我面临着类似的任务:庞大的C#代码库和广泛的预处理器指令用法。 手动重构看起来像是一个漫长而无聊的猴子工作。 我由于unifdef , sunifdef和coan C工具而失败,因为#region等一些C#语法细节。 从长远来看,我已经使自己的工具变得不确定 。 它使用regexp解析预处理器指令,并使用sympy python库简化逻辑表达式。 在1000万行的大型代码库上,它对我很有用。
我知道这三种设备类型没有通用的基类或接口。 您不能只在运行时选择三个变量之一并使用基本类型键入所有变量。
以下是一些选择:
dynamic
。 这可以通过减少工具帮助(减少自动完成,减少手头的文档,减少快速的静态错误检查)的代价来快速解决。 使用#if
解决此问题非常罕见。 这是有问题的,因为现在甚至可以确保代码编译的测试量增加了两倍。 您还需要多个二进制文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.