如何提高标志的可维护性和可读性

时间:2014-07-22 15:28:06

标签: c# flags readability

我继承了一些我需要用服务器和客户端维护的代码。某些设置当前通过一组内部二进制协议的标志传递给客户端。 如,

if (object.has.someAttribEnum == SYS_ON)
  settingsFlag = settingsFlag | 2;
...
...
if(foo.has.someAttribEnum == DISP_ON)
  settingsFlag = settingsFlag | 4398046511104;

这些设置变得非常庞大,因为标志是UInt64,所以我们处于2 ^ 45。此功能也相当巨大。开发人员很容易犯错误,例如使用值不是2的幂,打破客户端收到的整个设置标志。

最好的解决方案可能是通过二进制协议发送序列化对象?由于某些实施和时间限制,这可能不会立即实现。

我可以做些什么来提高这种可读性和可管理性?我甚至开始考虑使用内联而不是值 即,

if(foo.has.someAttribEnum == DISP_ON)
  settingsFlag = settingsFlag | (1 << 42);

我对此有任何想法。

1 个答案:

答案 0 :(得分:4)

你可以使用[Flags]枚举。它允许您轻松定义具有指定为不同值(通常为2的幂)的不同选项的枚举,并支持检查是否在给定枚举值中设置选项的操作;

示例:

[Flags]
public enum MySettings : ulong
{
    SYS_ON = 1 << 1,
    DISP_ON = 1 << 42,
}

if (settings.HasFlag(MySettings.SYS_ON))
{
    //do something
}

您还可以创建/设置如下设置:

MySettings settings = MySettings.SYS_ON | MySettings.DISP_ON