c# – 为什么使用FlagsAttribute定义EntityState枚举

c# – 为什么使用FlagsAttribute定义EntityState枚举,第1张

概述我正在为我们的应用程序做一个简单的实体更改日志记录. 出现的一个问题是,虽然DbEntityEntry.State属性的枚举值明显是互斥的( See MSDN),但它是使用Flags属性定义的,并且选择的值就好像它们可以组合一样. 假设价值相互排斥是否安全?他们为什么选择这条道路? Is it safe to assume that the values are mutually exclusiv 我正在为我们的应用程序做一个简单的实体更改日志记录.
出现的一个问题是,虽然DbEntityEntry.State属性的枚举值明显是互斥的( See MSDN),但它是使用Flags属性定义的,并且选择的值就好像它们可以组合一样.

假设价值相互排斥是否安全?他们为什么选择这条道路?

解决方法

Is it safe to assume that the values are mutually exclusive?

如果您计划将来兼容,那么没有.作者可能会添加一个值,该值可以与当前值之一结合以覆盖更广泛的状态.你最好掩盖.

它们可能没有,但是以这种方式定义会使该选项保持打开状态.

Why dID they chose this path?

或许,这样人们就不会认为这些价值观是相互排斥的.

大多数情况下,它允许在一次测试中进行掩盖测试,覆盖多个值:

if (state & (EntityState.Deleted | EntityState.ModifIEd | EntityState.Added) != 0)  …

这是有效的,因为枚举的值使用标志布局样式,其中每个都设置了不同的位(或根据另一个有意定义):

Detached = 1,Unchanged = 2,Added = 4,Deleted = 8,ModifIEd = 16

因此,EntityState.Deleted | EntityState.ModifIEd | EntityState.Added的值为8 | 16 | 4这是28.如果只是递增的值,它将无法工作:

Detached = 1,Added = 3,Deleted = 4,ModifIEd = 5

现在EntityState.Deleted | EntityState.ModifIEd | EntityState.Added的值为7,与EntityState.Detached相同Entity.Unchanged | Entity.Deleted.

FlagsAttribute用于提供元数据,表明您采用的是前一种方法而不是后者,因此屏蔽可以正常工作.它直接对类型本身产生的唯一影响是ToString()如何工作,这是为了在采用这种方法时提供更有意义的值.

总结

以上是内存溢出为你收集整理的c# – 为什么使用FlagsAttribute定义EntityState枚举全部内容,希望文章能够帮你解决c# – 为什么使用FlagsAttribute定义EntityState枚举所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1245500.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存