[Flags]
如果枚举具有属性并且具有相互独立的枚举值,则它可以用作标志:
的定义在SqlBulkCopyOptions
这里:https ://github.com/Microsoft/referencesource/blob/master/System.Data/System/Data/SqlClient/SqlBulkCopyOptions.cs
忽略移位语法的使用。实际值为:
Name Hex Dec Pow 2 Binary
Default = 0 = 0 = 0 = 00000000
KeepIdentity = 1 = 1 = 1 = 00000001
CheckConstraints = 2 = 2 = 2 = 00000010
TableLock = 4 = 4 = 3 = 00000100
KeepNulls = 8 = 8 = 4 = 00001000
FireTriggers = 10 = 16 = 5 = 00010000
UseInternalTxn = 20 = 32 = 6 = 00100000
观察每个值是 2 的下一个幂,这意味着在二进制(最后一列)中,它们的位是完全互斥的。
这意味着您可以将它们组合在一起,让您看到每个值都已设置,例如,如果您想要KeepIdentity
and TableLock
,那就是0x01
with 0x04
。我们使用 OR 运算符,但基于每比特,这为我们提供了我们想要的行为:
二进制:
00000001
00000100 OR
--------
00000101
观察第一位和第三位现在的情况1
。
因此,( KeepIdentity | TableLock == 5
)。
此方法不适用于不是 2 的幂的枚举值,例如,如果KeepIdentity
值为1
且CheckConstraints
值为 ,2
但TableLock
值为3
,则在二进制中它们是:
00000001 KeepIdentity
00000010 CheckConstraints
00000011 TableLock
请注意,通过分析 的位00000011
无法确定这是 和 的组合KeepIdentity
,CheckConstraints
还是单个TableLock
值。这就是为什么 flags 枚举值必须是: 1. 2 和 2 的幂:互斥(速记和组合值除外)。