繁体   English   中英

在C#中删除预处理器分支

[英]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#代码库和广泛的预处理器指令用法。 手动重构看起来像是一个漫长而无聊的猴子工作。 我由于unifdefsunifdefcoan C工具而失败,因为#region等一些C#语法细节。 从长远来看,我已经使自己的工具变得不确定 它使用regexp解析预处理器指令,并使用sympy python库简化逻辑表达式。 在1000万行的大型代码库上,它对我很有用。

我知道这三种设备类型没有通用的基类或接口。 您不能只在运行时选择三个变量之一并使用基本类型键入所有变量。

以下是一些选择:

  1. 找到一种常见的基本类型的方法
  2. 如果您不能修改类(或者由于某些原因而不合适),请编写包装器 该包装器可以具有您喜欢的任何结构。 每个设备类可以有一个具有通用基本类型的包装器。
  3. 使用dynamic 这可以通过减少工具帮助(减少自动完成,减少手头的文档,减少快速的静态错误检查)的代价来快速解决。

使用#if解决此问题非常罕见。 这是有问题的,因为现在甚至可以确保代码编译的测试量增加了两倍。 您还需要多个二进制文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM