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

C# Understanding why Bitwise OR is used in SSL Protocol assignment

给定以下 C#**:

handler.SSLProtocol = SslProtocols.Tls13 | SslProtocols.Tls12;

其中 SSLProtocol 是分配的 属性。 SslProtocols 是枚举。管道 | 是按位或。

我知道什么是按位或,它会执行以下操作,例如:101 | 100 = 101.

但是,我的问题是为什么要这样写代码?即为什么还要使用按位或?

为什么不像下面这样设置 属性:

handler.SSLProtocol = SslProtocols.TlsX;

或者 SslProtocols.Tls13 | SslProtocols.Tls12 等价于使用按位或?

(*例如我在这里假装 SslProtocols.Tls13 | SslProtocols.Tls1 = SslProtocols.TlsX)

**这行代码是一位朋友发给我的,我无法访问源代码以查看 Enum 或 SSLProtocol 属性 定义,但我猜它可能是 System.Net.SecurityProtocolType

给定一个包含 8 个枚举项的标志枚举,使用按位或可以表示 2^8 = 256 个配置。通过 32 个选项,您可以代表超过 40 亿种组合。因此,如果没有 OR,您将不得不定义所有可能的枚举选项。即使想出专有名称也是具有挑战性的。

您可以将这两种方法结合起来。如果一个或多个标志组合是常见的,您可以定义它们以及枚举项的一部分。

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

enum MyEnum
{
    One = 1;
    Two = 2;
}

var three = (MyEnum)3; //is this legal?

是的,可以正常编译。如果 MyEnum 不是位字段([Flags] 属性),但它不是由编译器强制执行的,那么它可以说是一个糟糕的选择。如果语言区分枚举和标志可能是个好主意,因为它们是完全不同的东西,但那列火车很久以前就经过了。

另一方面,如果 enum 是一个位域,那么 oring 是 必须 因为枚举选项不是唯一的(这正是重点标志),如果在定义 enum 类型时必须想出所有可能的有效组合,它就不会很有用:

[Flags]
enum AnimalTraits
{
     None         = 0
     Reptile      = 1 << 0,
     Mammal       = 1 << 1,
     Vertebrate   = 1 << 2,
     Invertebrate = 1 << 3,
     Amphybious   = 1 << 4,
     Acuatic      = 1 << 5,
     //etc.
}

var myAnimalFlags =  AnimalTraits.Invertebrate | 
                     AnimalTraits.Amphybious | 
                     AnimalTraits.Reptile

现在您有一个枚举值,其中设置了这三个标志,可以方便地过滤数据、在某些 UI 中设置选项等。