c# - 排除代码的更好解决方案?

标签 c# c-preprocessor

由于需求来回变化,我们的代码中有一些使用常量的 if/else block ,例如:

const bool DisplayAverageValues = true;
if(DisplayAverageValue)
{
  // Do this
}
else
{
  // Do that
}

由于要求可能会再次更改,我们不想删除当前未使用的代码 - 下周可能需要它。我们也不想注释掉未使用的代码,因为我们希望它成为任何重构的一部分。只需更改 bool 值,它就可以随时准备编译。

问题是我们收到无法访问代码的警告,所以我考虑用预处理器 #if/#else 替换标准的 if/else block 。

#define DisplayAverageValues
#if DisplayAverageValue
  // Do this
#else
  // Do that
#endif

我现在面临的问题是预处理器符号不能设置为false,只能定义或未定义。从以下更改会更加明显:

#define DisplayAverageValues true

#define DisplayAverageValues false

代替

#undef DisplayAverageValues

//#define DisplayAverageValues

(如果在其他地方使用了相同的符号名称,可能会造成问题)。

有没有更好的办法?

最佳答案

如果您的代码架构中有预置切片,当一个代码必须可编译且不与其他代码交叉时,预处理器指令非常有用。在您的情况下,您似乎面临不同的选项,这些选项也可能以某种方式在代码执行流程中与需求相交。

在我看来,最好的管理方法是定义一个 OptionsRuntimeConfigurations 或任何其他类,其中包含会影响您的应用程序运行时行为的所有属性, 并沿着必须考虑不同执行选项的应用程序部分传递该类的实例(也可能是Singletone)。

如 Daniel 所说,另一种选择是将该代码提取到不同的模块、插件(如果您愿意)中,然后动态加载它们。但它可能会或可能不会实现,顺便说一句,如果以前在您的架构中没有考虑到这一点,您通常需要花费无关紧要的时间来实现这种灵 active 。

关于c# - 排除代码的更好解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16396538/

相关文章:

具有自定义事件访问器的 C# 事件(添加和删除)

c# - 确保 WebApi 中的路由安全

c# - 'SQLite.SQLiteConnection' 的类型初始值设定项引发异常

c# - 从 Windows 商店应用程序中的后台任务访问文件

c++ - 在 token 中使用定义的常量

c++ - 在 Visual Studio 2008 中使用 _DEBUG 预处理器定义 - C++

linux - 预处理器指令返回值

c# - 使用 LINQ-to-SQL 返回已筛选子对象的对象

c++ - #define 和一元 ‘*’ 的无效类型参数(有 ‘double’ )

c++ - 在 vim 中创建 include guard