我正在实现一个生活在屏幕上的视图。根据以下配置参数,当屏幕大小发生变化时,视图将被定位并调整大小。
enum DLViewLayout
{
DLViewLayoutSolo = 1,
DLViewLayoutDual = 2
};
enum DLViewFixedHorizontalProperty
{
DLViewFixedHorizontalPropertyWidth = 4, // View margins scale with the screen width.
DLViewFixedHorizontalPropertyMargin = 8 // View width scales with the screen width.
};
enum DLViewFixedVerticalProperty
{
DLViewFixedVerticalPropertyHeight = 16,
DLViewFixedVerticalPropertyMargin = 32
};
enum DLViewHorizonalAlignment
{
DLViewHorizonalAlignmentLeft = 64,
DLViewHorizonalAlignmentCenter = 128,
DLViewHorizonalAlignmentRight = 256
};
enum DLViewVerticalAlignment
{
DLViewVerticalAlignmentTop = 512,
DLViewVerticalAlignmentMiddle = 1024,
DLViewVerticalAlignmentBottom = 2048
};
我想知道在什么情况下,按位OR
组合枚举值来传递视图状态是有意义的。
int viewState = DLViewLayoutSolo | DLViewFixedHorizontalPropertyWidth | DLViewFixedVerticalPropertyMargin | DLViewHorizonalAlignmentCenter | DLViewVerticalAlignmentMiddle;
// viewState = 1189
我希望类的用户配置所有参数。我该如何执行?
在类中,我可以通过按位AND
组合状态来检索单个设置。
if (viewState & DLViewLayoutSolo)
{
// Set up solo view layout.
}
else if (viewState & DLViewLayoutDual)
{
// Set up dual view layout.
}
您想要使用来自不同枚举的值组合标志吗?
这是永远不会成为最佳实践,事实上,我从来没有在任何实践中看到过它,无论是好是坏。这样,除其他问题外,任何使用这些标志属性的实例的元素都必须知道,或者期望知道,它是来自这些不同enum
类型的值的合并。
既然值相应递增,为什么不简单地使用由所有成员组成的适当命名的枚举呢?
同样,如果我们在这里谈论。net(虽然合法,分号告诉我可能不是),这样的enum
类型应该用[Flags]
属性装饰,但是,仍然只能组合相同的enum
类型的值。
听起来好像您希望字段的值代表每个子条件的状态:
enum DLViewLayout
{
DLViewLayoutSolo,
DLViewLayoutDual
};
enum DLViewFixedHorizontalProperty
{
DLViewFixedHorizontalPropertyWidth, // View margins scale with the screen width.
DLViewFixedHorizontalPropertyMargin // View width scales with the screen width.
};
enum DLViewFixedVerticalProperty
{
DLViewFixedVerticalPropertyHeight,
DLViewFixedVerticalPropertyMargin
};
enum DLViewHorizonalAlignment
{
DLViewHorizonalAlignmentLeft,
DLViewHorizonalAlignmentCenter,
DLViewHorizonalAlignmentRight
};
enum DLViewVerticalAlignment
{
DLViewVerticalAlignmentTop,
DLViewVerticalAlignmentMiddle,
DLViewVerticalAlignmentBottom
};
struct DLView {
DLViewLayout layout;
DLViewFixedHorizontalProperty fixed_horizontal;
DLViewFixedVerticalProperty fixed_vertical;
DLViewHorizonalAlignment horizontal;
DLViewVerticalAlignment vertical;
};
// ...
DLView viewState;
// ...
if ( viewState.layout == DLViewLayoutSolo ) { ... }
else if ( viewState.layout == DLViewLayoutDual ) { ... }
}
/// repeat per field
如果您关心内存消耗,并且有正当理由这样做,那么您可以使用不可移植的位域结构:
struct DLView {
DLViewLayout layout : 1;
DLViewFixedHorizontalProperty fixed_horizontal : 1;
DLViewFixedVerticalProperty fixed_vertical : 1;
DLViewHorizonalAlignment horizontal : 2;
DLViewVerticalAlignment vertical : 2;
};