gpt4 book ai didi

c# - 为什么 EntityState 枚举是用 FlagsAttribute 定义的

转载 作者:太空狗 更新时间:2023-10-29 20:27:10 26 4
gpt4 key购买 nike

我正在为我们的应用程序做一个简单的实体更改日志记录。出现的一个问题是,虽然 DbEntityEntry.State 属性的枚举值显然是互斥的 (See MSDN),但它是用 Flags 属性定义的,并且选择了值好像它们可以组合。

假设这些值是互斥的是否安全?他们为什么选择这条路?

最佳答案

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

如果您计划 future 的兼容性,则否。作者可能会添加一个值,该值可以与当前值之一结合以涵盖更广泛的状态。你最好不要掩饰。

他们可能不会,但以这种方式定义会使该选项处于打开状态。

Why did they chose this path?

也许,这样人们就不会认为这些值是相互排斥的。

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

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

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

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

因此,EntityState.Deleted | EntityState.Modified | EntityState.Added 的值为 8 | 16 | 428。如果刚刚增加的值将不起作用:

Detached = 1,
Unchanged = 2,
Added = 3,
Deleted = 4,
Modified = 5

现在 EntityState.Deleted | EntityState.Modified | EntityState.Added 的值为 7,与 EntityState.Detached | 相同实体。不变 |实体.Deleted.

FlagsAttribute 用于提供元数据,指示您采用前一种方法而不是后者,因此屏蔽可以起作用。它直接对类型本身产生的唯一影响是 ToString() 的工作方式,即在采用这种方法时提供比不采用时更有意义的值。

关于c# - 为什么 EntityState 枚举是用 FlagsAttribute 定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32884534/

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