【问题标题】:How to improve maintainability and readability of flags如何提高标志的可维护性和可读性
【发布时间】:2014-07-22 23:53:02
【问题描述】:

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

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);

感谢您对此的任何想法。

【问题讨论】:

  • 您是否考虑过使用 [Flags] 枚举? stackoverflow.com/questions/8447/…
  • 我还建议走枚举路线
  • 你的意思是(1 &lt;&lt; 42)。我推荐一个标志枚举,其成员是根据班次定义的。
  • 与@mclaassen Flags 枚举相同的问题是考虑到这一点而设计的。可能也非常简单地 someAttribEnum
  • @usr 是的,谢谢,已编辑。

标签: c# flags readability


【解决方案1】:

您可以使用 [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

【讨论】:

  • 我最初认为你不能使用比 Int32 更长的时间,但是在阅读了你的答案和上面的 cmets 之后,我测试并且 ulong 工作得很好!这正是我现在的解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2011-03-08
  • 1970-01-01
相关资源
最近更新 更多