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 中设置选项等。
给定以下 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 中设置选项等。