gpt4 book ai didi

c# - 标记枚举和按位运算与 “string of bits”

转载 作者:IT王子 更新时间:2023-10-29 04:03:20 24 4
gpt4 key购买 nike

一位开发人员建议我们将一周中的几天选择存储为由 1 和 0 组成的 7 个字符的字符串,即“1000100”代表星期一和星期五。我更喜欢(并强烈建议)带有 Flags 枚举和按位运算的解决方案,我认为这是一种更简洁的方法,其他开发人员应该更容易理解。

  [Flags()]
public enum Weekdays : int
{
Monday = 1,
Tuesday = 2,
Wednesday = 4,
Thursday = 8,
Friday = 16,
Saturday = 32,
Sunday = 64
}

但是,当我开始实现示例解决方案时,我意识到也许简单的字符串方法毕竟更简单:如果您只看数据,位串肯定比“17”更明显。我发现 C# 按位运算违反直觉且极其冗长:

Weekdays workDays = Weekdays.Monday | Weekdays.Tuesday;
if ((workDays & Weekdays.Monday) == Weekdays.Monday)
{...}

当然这可以很好地包装到扩展方法中,但是我们突然以至少与字符串解决方案相同数量的代码结束,而且我很难说按位代码更容易阅读。

话虽如此,我仍然会使用标志枚举和按位运算。我能想到的主要好处是

  • 更好的表现
  • 所需的存储空间更少

那么我该如何向我的同事推销按位解决方案呢?我是不是该?在字符串上使用此方法还有哪些其他好处?完成示例项目后,我发现团队仍然选择了基于字符串的解决方案。我需要一些更好/更有力的论据。为什么应该使用标志枚举而不是简单的位串?

最佳答案

使用 Flags 枚举的好处:

使用 Flags 枚举的缺点:

  • 人类难以理解的数据表示(例如,为 17 设置了哪些标志?)


使用位串的好处:

  • 便于程序员查看字符串中设置了哪些位

使用位串的负面影响:

  • 非标准方法
  • 不熟悉您的设计的程序员更难理解
  • 可能更容易设置“垃圾”值(例如 stringValue = "Sunday")
  • 不必要的字符串创建
  • 不需要的字符串解析
  • 其他开发工作
  • 重新发明轮子(但不是圆轮)


能够查看位串以查看设置的内容真的有多重要?如果很难知道 17 是星期一和星期五,您可以随时使用计算器并转换为二进制。或者添加某种字符串表示形式以供“显示”(或调试)使用。这并不那么难。


在我看来,如果您要使位串接近可靠,那么您将需要做相当多的封装以将其提升到 Flags 枚举已经达到的抽象级别提供。如果方法是直接简单地操作位串,那么这将难以阅读(和理解)并且可能容易出错。

例如你最终可能会看到这个:

days = "1000101"; // fixed bug where days were incorrectly set to "1010001"

关于c# - 标记枚举和按位运算与 “string of bits”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1285986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com