C# Понимание, почему побитовое ИЛИ используется в назначении протокола SSL - PullRequest
0 голосов
/ 29 апреля 2020

С учетом следующего 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

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Во-первых, вы, вероятно, предполагаете что-то ложное:

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

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

Да, это так, что скомпилируется просто отлично. Возможно, это плохой выбор, если MyEnum не является битовым полем (атрибут [Flags]), но не применяется компилятором. Вероятно, было бы неплохо, если бы в языке проводилось различие между перечислениями и флагами, потому что это совершенно разные вещи, но этот поезд долго проходил через go.

Если с другой стороны enum - это битовое поле, тогда oring - это must , потому что параметры перечисления не являются исключительными (в этом и заключается весь смысл флагов), и это было бы не очень полезно, если бы вам пришлось подойти с каждой возможной допустимой комбинацией при определении типа 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

Теперь у вас есть значение enum, для которого установлены эти три флага, которые могут быть полезны для фильтрации данных, настройки параметров в некотором пользовательском интерфейсе и т. д. c.

0 голосов
/ 29 апреля 2020

Учитывая перечисление флагов с 8 элементами перечисления, с побитовым ИЛИ вы можете express 2 ^ 8 = 256 конфигураций. С 32 опциями вы можете представить более 4 миллиардов комбинаций. Таким образом, без OR вы должны были бы определить все возможные параметры enum. Даже придумать собственные имена было бы непросто.

Хотя вы можете объединить два подхода. Если одна или несколько комбинаций флагов являются общими, вы можете определить их, а также часть перечисляемых элементов.

...