gpt4 book ai didi

c# - Enum.HasFlag,为什么没有 Enum.SetFlag?

转载 作者:IT王子 更新时间:2023-10-29 04:14:03 26 4
gpt4 key购买 nike

我必须为我声明的每个标志类型构建一个扩展方法,如下所示:

public static EventMessageScope SetFlag(this EventMessageScope flags, 
EventMessageScope flag, bool value)
{
if (value)
flags |= flag;
else
flags &= ~flag;

return flags;
}

为什么没有 Enum.SetFlag 就像有 Enum.HasFlag 一样?

另外,为什么这并不总是有效?

public static bool Get(this EventMessageScope flags, EventMessageScope flag)
{
return ((flags & flag) != 0);
}

例如,如果我有:

var flag = EventMessageScope.Private;

然后像这样检查:

if(flag.Get(EventMessageScope.Public))

EventMessageScope.Public 实际上是 EventMessageScope.Private | EventMessageScope.PublicOnly,它返回 true。

如果不是,因为Private不公开,只是半公开。

同样适用于:

if(flag.Get(EventMessageScope.None))

返回 false,除了范围实际上是 None (0x0),什么时候它应该总是返回 true?

最佳答案

Why isn't there an Enum.SetFlag like there is an Enum.HasFlag?

HasFlag 作为按位运算需要更复杂的逻辑并重复相同的标志两次

 myFlagsVariable=    ((myFlagsVariable & MyFlagsEnum.MyFlag) ==MyFlagsEnum.MyFlag );

所以 MS 决定实现它。

SetFlag和ClearFlag在C#中简洁

    flags |= flag;// SetFlag

flags &= ~flag; // ClearFlag

但不幸的是不直观。每次我需要设置(或清除)一个标志时,我都会花几秒钟(或几分钟)思考:该方法的名称是什么?为什么它没有在智能感知中显示?或者不,我必须使用按位运算。注意,有些开发者还会问:什么是位运算?

是否应该创建 SetFlag 和 ClearFlag 扩展 - YES 以出现在智能感知中。

开发人员是否应该使用 SetFlag 和 ClearFlag 扩展 - 否,因为它们效率不高。

我们已经在我们的库类 EnumFlagsHelper 中创建了扩展,比如 SomeEnumHelperMethodsThatMakeDoingWhatYouWantEasier ,但将函数命名为 SetFlag 而不是 Include 和 ClearFlag 而不是 Remove。

我决定在 SetFlag 方法的主体(和摘要注释中)添加

Debug.Assert( false, " do not use the extension due to performance reason, use bitwise operation with the explanatory comment instead \n 
flags |= flag;// SetFlag")

类似的消息应该添加到 ClearFlag

Debug.Assert( false, " do not use the extension due to performance reason, use bitwise operation with the explanatory comment instead \n 
flags &= ~flag; // ClearFlag ")

关于c# - Enum.HasFlag,为什么没有 Enum.SetFlag?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5850873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com