为什么我们需要在 switch 语句中分支时对位字段执行按位与
Why do we need to perform bitwise AND to a bit field when branching inside a switch statement
我真的不明白为什么我们需要在下面的代码中通过 BindingFlags.Types
按位应用 AND
:
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
}
有人可以澄清一下吗?
I don't really understand why we need to apply logical AND by BindingFlags.Types in the code below:
这是一个按位 AND (&
),而不是逻辑一个(&&
)。
您需要它来过滤掉其他位(例如,SyntheticProperty
)。 BindingFlags.Type
仅包含 TypeXYZ
位。
例如,如果binding.flags
同时具有SyntheticProperty
(0b00010000)和TypeElementClass
(0b00000010),则其值为0b00010010。由于 switch
只需要匹配类型的标志,它使用 BindingFlags.Types
(0b00001111) 和 &
来屏蔽非类型值。 0b00010010 & 0b00001111 是 0b0001000,所以它符合 SyntheticProperty
的情况。
我真的不明白为什么我们需要在下面的代码中通过 BindingFlags.Types
按位应用 AND
:
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
}
有人可以澄清一下吗?
I don't really understand why we need to apply logical AND by BindingFlags.Types in the code below:
这是一个按位 AND (&
),而不是逻辑一个(&&
)。
您需要它来过滤掉其他位(例如,SyntheticProperty
)。 BindingFlags.Type
仅包含 TypeXYZ
位。
例如,如果binding.flags
同时具有SyntheticProperty
(0b00010000)和TypeElementClass
(0b00000010),则其值为0b00010010。由于 switch
只需要匹配类型的标志,它使用 BindingFlags.Types
(0b00001111) 和 &
来屏蔽非类型值。 0b00010010 & 0b00001111 是 0b0001000,所以它符合 SyntheticProperty
的情况。