按位OR来定义SqlBulkCopyOptions?

bitwise-or c# sqlbulkcopy

所以我向我的一位资深Dev寻求帮助来弄清楚与事务范围有关的问题,他来到我的办公桌并在SqlBulkCopy上使用了不同的重载,对于SqlBulkCopyOptions参数,他做了类似下面的事情:

SqlBulkCopyOptions options = (SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints);

它现在有效,但我没有得到一bitwise or在这里意味着什么。我以为我对它有一些了解,从来没有真正使用它,但这种用法让我抓狂。是的,我没有要求我的大四学生向我解释..我希望有人能帮我理解这句话的作用。网上的大多数按位或示例都有一些数字,我得到(我认为),但是这个?

一般承认的答案

如果enum具有[Flags]属性并且具有彼此独立的枚举值,则可以将枚举用作标志:

SqlBulkCopyOptions的定义如下: https//github.com/Microsoft/referencesource/blob/master/System.Data/System/Data/SqlClient/SqlBulkCopyOptions.cs

忽略使用bitshift语法。实际值是:

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的下一个幂,这意味着在二进制(最后一列)中它们的位完全互斥。

这意味着您可以以允许您查看每个值的方式组合它们,例如,如果您需要KeepIdentityTableLockTableLock 0x010x04 。我们使用OR运算符,但是按位,这给了我们想要的行为:

二进制:

00000001
00000100 OR
--------
00000101

观察第一和第三位现在是如何1

因此,( KeepIdentity | TableLock == 5 )。

这种方法不适用于不是2的幂的枚举值,例如,如果KeepIdentity的值为1CheckConstraints的值为2TableLock的值为3 ,那么在二进制中它们是:

00000001 KeepIdentity
00000010 CheckConstraints
00000011 TableLock

通过分析00000011的位来观察,无法确定这是KeepIdentityCheckConstraints的组合,还是单个TableLock值。这就是为什么标志枚举值必须是:1。2和2的幂:互斥(对于速记和组合值的例外)。


热门答案

enum的原理与数字完全相同,因为enum的基础类型始终是整数类型。如果你看一下SqlBulkCopyOptions声明 ,你会发现它的成员的底层值是2的幂,这样就可以用这种方式组合它们。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow