5

最近、古い 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 を装飾することの利点 (さらに重要なことに、考えられる副作用) は何でしょうか?

アップデート

ジョン・スキートへの回答:

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
}
4

2 に答える 2

8

Resharper はConvertStatus.Running、属性を受け取ることを推奨していませんが、ConvertStatus列挙型全体を受け取ります。

MSDNから、次のFlagsAttributeように説明されています。

列挙型をビット フィールドとして扱うことができることを示します。つまり、一連のフラグです。

ビット フィールドとして実際に使用可能であることが示されていない列挙型でビットごとの演算を使用しているため、R# は、コードが実行時に意図しない影響を与える可能性があることを警告しています。属性自体を使用して[Flags]も、列挙型の実装が実際にビット フィールドに期待される値と一致することは保証されませんが外部の世界が期待する必要があるという契約が作成されます。

于 2013-09-23T16:35:31.857 に答える
1

列挙型のクライアントに、それが実際にフラグであることを伝えます。また、 Microsoft の変更方法の例を見ることができますToString()

于 2013-09-23T16:32:43.383 に答える