C#了解为什么在SSL协议分配中使用按位OR

问题描述 投票:0回答:2

给出以下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

c# .net enums bitwise-operators bitwise-or
2个回答
0
投票

首先,您可能假设是错误的:

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中设置选项,等等。


0
投票

给出一个带有8个枚举项的标志枚举,按位或可以表示2 ^ 8 = 256个配置。使用32个选项,您可以代表超过40亿个组合。因此,如果没有OR,则必须定义所有可能的枚举选项。即使想出合适的名字也将是一个挑战。

© www.soinside.com 2019 - 2024. All rights reserved.