给出以下C#**:
handler.SSLProtocol = SslProtocols.Tls13 | SslProtocols.Tls12;
SSLProtocol
是要分配的属性。 SslProtocols
是一个枚举。并且管道|
是按位OR。
我知道什么是按位或,例如,它将执行以下操作:101 | 100 = 101
。
但是,我的问题是为什么要这样编写代码?即为什么还要使用按位OR?
为什么不像下面这样设置属性:
handler.SSLProtocol = SslProtocols.TlsX;
或者无论是SslProtocols.Tls13 | SslProtocols.Tls12
的等效项等于还是按位或?
(*对于这个例子,我假装是SslProtocols.Tls13 | SslProtocols.Tls1 = SslProtocols.TlsX
)
**这行代码是由朋友发送给我的,我无权查看Enum或SSLProtocol属性定义的源,但我猜想它可能是System.Net.SecurityProtocolType
首先,您可能假设是错误的:
enum MyEnum
{
One = 1;
Two = 2;
}
var three = (MyEnum)3; //is this legal?
是的,这样编译就可以了。如果MyEnum
不是位字段([Flags]
属性),但编译器未强制执行,则这可能是一个错误的选择。如果该语言在枚举和标志之间进行区分,则可能是一个好主意,因为它们是完全不同的东西,但很久以前就已经通过了。
另一方面,enum
是位字段,那么oring是必须,因为枚举选项不是排他性的(恰好是标志的整个要点),并且它不是很有用如果在定义enum
类型时必须提出所有可能的有效组合:
[Flags]
enum AnimalTraits
{
Reptile,
Mammal,
Vertebrate.
Invertebrate,
Amphybious,
Acuatic,
//etc.
}
var myAnimalFlags = AnimalTraits.Invertebrate |
AnimalTraits.Amphybious |
AnimalTraits.Reptile
现在您已经设置了一个枚举值,该枚举值设置了这三个标志,可以很方便地过滤数据,在某些UI中设置选项,等等。
给出一个带有8个枚举项的标志枚举,按位或可以表示2 ^ 8 = 256个配置。使用32个选项,您可以代表超过40亿个组合。因此,如果没有OR,则必须定义所有可能的枚举选项。即使想出合适的名字也将是一个挑战。