Зачем нам нужно выполнять побитовое И для битового поля при ветвлении внутри оператора switch - PullRequest
0 голосов
/ 01 марта 2019

Я не очень понимаю, почему мы должны применять побитовое AND на BindingFlags.Types в коде ниже:

switch (binding.flags & BindingFlags.Types) {
    case BindingFlags.TypeElementAttribute:
      setElementAttribute(view, binding, renderNode, binding.ns, name, value);
      break;
    case BindingFlags.TypeElementClass:
      setElementClass(view, renderNode, name, value);
      break;
    case BindingFlags.TypeElementStyle:
      setElementStyle(view, binding, renderNode, name, value);
      break;
    case BindingFlags.TypeProperty:
      const bindView = (def.flags & NodeFlags.ComponentView &&
                        binding.flags & BindingFlags.SyntheticHostProperty) ?
          elData.componentView :
          view;
      setElementProperty(bindView, binding, renderNode, name, value);
      break;
  }

Вот BindingFlags определение:

export const enum BindingFlags {
  TypeElementAttribute = 1 << 0,
  TypeElementClass = 1 << 1,
  TypeElementStyle = 1 << 2,
  TypeProperty = 1 << 3,
  SyntheticProperty = 1 << 4,
  SyntheticHostProperty = 1 << 5,
  CatSyntheticProperty = SyntheticProperty | SyntheticHostProperty,

  // mutually exclusive values...
  Types = TypeElementAttribute | TypeElementClass | TypeElementStyle | TypeProperty
}

Может кто-нибудь уточнить, пожалуйста?

1 Ответ

0 голосов
/ 01 марта 2019

Я не очень понимаю, почему мы должны применять логическое И с помощью BindingFlags.Types в приведенном ниже коде:

Это поразрядное И (&), а не логический (&&).

Он нужен вам для того, чтобы отфильтровать другие биты (например, SyntheticProperty).BindingFlags.Type включает только биты TypeXYZ.

Например, если binding.flags имеет оба SyntheticProperty (0b00010000) и TypeElementClass (0b00000010), его значение равно 0b00010010.Поскольку switch должен совпадать только с флагами типов, он использует BindingFlags.Types (0b00001111) с & для маскировки значений, не относящихся к типам.0b00010010 & 0b00001111 - это 0b0001000, поэтому он соответствует случаю SyntheticProperty.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...