我继承了一些我需要用服务器和客户端维护的代码。某些设置当前通过一组内部二进制协议的标志传递给客户端。 如,
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);
我对此有任何想法。
答案 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