为什么MethodImplAttributes没有标记FlagsAttribute?

时间:2016-08-01 00:47:50

标签: c# reflection

    /// <summary>
    /// Specifies flags for the attributes of a method implementation.
    /// </summary>
    [ComVisible(true)]
    [__DynamicallyInvokable]
    [Serializable]
    public enum MethodImplAttributes
    {
      [__DynamicallyInvokable] IL = 0,
      [__DynamicallyInvokable] Managed = 0,
      [__DynamicallyInvokable] Native = 1,
      [__DynamicallyInvokable] OPTIL = 2,
      [__DynamicallyInvokable] CodeTypeMask = 3,
      [__DynamicallyInvokable] Runtime = 3,
      [__DynamicallyInvokable] ManagedMask = 4,
      [__DynamicallyInvokable] Unmanaged = 4,
      [__DynamicallyInvokable] NoInlining = 8,
      [__DynamicallyInvokable] ForwardRef = 16,
      [__DynamicallyInvokable] Synchronized = 32,
      [__DynamicallyInvokable] NoOptimization = 64,
      [__DynamicallyInvokable] PreserveSig = 128,
      [ComVisible(false), __DynamicallyInvokable] AggressiveInlining = 256,
      [__DynamicallyInvokable] InternalCall = 4096,
      MaxMethodImplVal = 65535,
    }

为什么这个枚举没有标记FlagsAttribute?它可以在MSDN上找到的所有示例中像位域一样使用,并且MSDN上属性的大多数指南都符合此定义。

MethodBuilder.SetImplementationFlags()甚至暗示它被用作除了MSDN示例代码之外的[Flags]标记的枚举。

1 个答案:

答案 0 :(得分:0)

您始终可以在这些枚举上使用位操作,即使它们未标记为FlagsAttribute。事实上,FlagsAttribute仅用于.ToString方法,使输出字符串更漂亮。

enum DataFlag
{
    Private = 1,
    Important = 2,
    Persistant = 4
}

var flag = DataFlag.Private | DataFlag.Persistant;
var test = flag.HasFlag(DataFlag.Private); //True with/without FlagAttribute
var stringResult = flag.ToString();   // with FlagAttribute: Private, Persistant 
                                      // without :   5

顺便说一句,此枚举有MethodImplAttributes.IL = 0,即使您有.ToString,它也不会出现在FlagsAttribute输出中,并且一些字段具有相同的值,这可能会导致意外行为字符串结果。一般来说,使用FlagsAttribute标记此属性是正确和良好的做法。