c# - 为什么 MethodImplAttributes 没有标记 FlagsAttribute?

标签 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] 的枚举一样使用。

最佳答案

您始终可以对这些枚举使用位操作,即使它们没有用 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 标记此属性是正确的良好做法。

关于c# - 为什么 MethodImplAttributes 没有标记 FlagsAttribute?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38689649/

相关文章:

C# 保存类以供使用

c# - Asp.net 用户登录计数和 LastLogin

c# - 将 double 转换为 decimal 还是从 double 构造 "new"decimal 更好?

c# - 以编程方式使用 LowProfileImageLoader

go - 从 reflect.Type 中删除指针

c# 将 winforms 图表绑定(bind)到对象列表

c# - 在编译时循环遍历类中的所有对象 C#

c# - 如何通过反射获取委托(delegate)类型的返回类型?

java - 使用私有(private)字段和私有(private)构造函数将对象写入文件

c# - GetType() 是方法还是类?