我注意到这两种模式用于检查枚举标志:
[Flags]
public enum PurchaseType
{
None = 0,
SalePrice = 2,
RegularPrice = 4,
Clearance = 8,
CreditCard = 16
}
public void Test()
{
PurchaseType type = PurchaseType.Clearance;
type |= PurchaseType.CreditCard;
// Practice 1
if ((type & PurchaseType.Clearance) == PurchaseType.Clearance)
{
// Clearance item handling
}
// Practice 2
if ((type & PurchaseType.CreditCard) != 0)
{
// Credit card item handling
}
}
在检查枚举标志的两种方法中,哪一种更好w.r.t性能,可读性,代码健康以及我应该做的任何其他考虑?
谢谢, 穆罕默德
答案 0 :(得分:15)
.Net 4引入了一个HasFlag
方法,用于确定当前实例中是否设置了一个或多个位字段,这是最佳实践:
type.HasFlag(PurchaseType.CreditCard); // true
答案 1 :(得分:2)
我会选择第一个:
if ((type & PurchaseType.Clearance) == PurchaseType.Clearance)
{
// Clearance item item handling
}
明确表示您正在检查Clearance
类型的状态。
答案 2 :(得分:1)
我个人总是更喜欢HasFlag
的清晰可读性。
但是,在问题的两个选项中,我认为!=0
更安全,因为它没有重复。如果你使用替代方案,那么当维护编码改变其中一个标志而忘记改变另一个标志时,这很容易。然后你最终得到了这个
if ((type & PurchaseType.Clearance) == PurchaseType.CreditCard)
答案 3 :(得分:1)
我更喜欢(type & PurchaseType.CreditCard) != 0
,因为如果你想检查多个位,那么右手边会变得很麻烦。我相信位操作,只有在设置了位时,上述操作才会成立。