gpt4 book ai didi

c# - 使用 [Flags] 属性标记枚举的原因是什么?

转载 作者:太空狗 更新时间:2023-10-29 22:32:40 25 4
gpt4 key购买 nike

我们最近将一个旧的 C# 应用程序从 Visual Studio 2003 移植到了 Visual Studio 2010。

在代码中寻找要清理的东西时,我在上面运行了 Resharper,它告诉我(很多次),“未由 [Flags] 属性标记的枚举的按位运算”

例如,这是它用该消息“标记”(无双关语)的一些代码:

~DuckbillConverter()
{
//stop running thread
if((this.Status & ConvertStatus.Running) == ConvertStatus.Running)
this.Stop();
}

我假设这段代码按原样工作;那么按照 R# 的建议,使用 [Flags] 属性装饰 ConvertStatus.Running 有什么好处(或者更重要的是,任何可能的副作用)?

更新

对 Jon Skeet 的回答:

public enum ConvertStatus
{
/// <summary>
/// The thread is not running, there are no manual conversions or purges and no errors have occurred.
/// </summary>
Stopped = 0x0,
/// <summary>
/// The thread is running and will automatically convert all sites for both file types.
/// </summary>
Running = 0x1,
/// <summary>
/// A data conversion is currently taking place.
/// </summary>
Converting = 0x2,
/// <summary>
/// A data purge is currently taking place.
/// </summary>
Purging = 0x4,
/// <summary>
/// An error has occurred. Use the LastError property to view the error message.
/// </summary>
Error = 0x8
}

最佳答案

Resharper 不建议 ConvertStatus.Running 接收一个属性,而是整个 ConvertStatus 枚举。

来自 MSDN , FlagsAttribute 描述为:

Indicates that an enumeration can be treated as a bit field; that is, a set of flags.

由于您对指示实际可用作位字段的枚举使用按位运算,因此 R# 警告您您的代码可能在运行时产生意想不到的效果。使用 [Flags] 属性本身并不能保证枚举的实现实际上与位字段的预期值一致,但它确实创建了一个合约外界应该期望如此。

关于c# - 使用 [Flags] 属性标记枚举的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18964285/

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