【问题标题】:C# sizeof(enum) alternative? (to workaround resharper false error)?C# sizeof(enum) 替代方案? (解决方法 resharper 错误错误)?
【发布时间】:2010-11-18 20:44:19
【问题描述】:

在 C# 中,我有一些与 UAC 提升相关的“安全”API 代码。它涉及获取枚举的大小(如下)

int myEnumSize = sizeof (MyEnum);

代码本身是有效的,可以编译,正常工作等。但是 Resharper 错误地将其标记为解决方案中的错误(“不能在安全上下文中使用不安全的构造”)。 (Starting with version 2.0 of C#, applying sizeof to built-in types no longer requires that unsafe mode be used.) 我喜欢 Resharper,我喜欢解决方案分析,但是在解决方案中使用此代码时,我的角落里有一个大红点,让我总觉得有些东西坏了。如果我告诉 resharper 忽略此错误,它会在几分钟内返回。

我会向 JetBrains 提出这个问题,但我查看了他们的跟踪器,他们已经记录了一个自 3 月以来一直被忽略的日志。再往前看,他们至少有两个其他实例可以追溯到几年前,都以“无复制”状态被解雇。我不想注册他们的跟踪器只是为了给这个错误投票。我仍然可以屏住呼吸好几年。最快的方法就是解决这个问题。

什么是最好的替代方案,它仍然是正确的,并且以后给维护者带来任何麻烦的可能性最小?

我可以将其硬编码为:

int myEnumSize = 4;  

还有更正确的解决方案吗? -- 哪个不使用 sizeof(enum)?

顺便说一句:

 Marshal.SizeOf() 

完全“安全”,但返回错误的大小。

PS。有问题的代码深受来自 Microsoft 的 UACSelfElvation 演示代码的影响。如果你想了解更多细节。但我认为它们无关紧要。

【问题讨论】:

    标签: c# interop resharper sizeof


    【解决方案1】:

    看起来很难看,但可能有用:

    int myEnumSize = Marshal.SizeOf(Enum.GetUnderlyingType(typeof(MyEnum)));
    


    John Gietzen 编辑:
    证明:
    enum Enum1 : sbyte { A, B, C, D }
    enum Enum2 : short { A, B, C, D }
    enum Enum3 : int { A, B, C, D }
    enum Enum4 : long { A, B, C, D }
    
    enum Enum5 : byte { A, B, C, D }
    enum Enum6 : ushort { A, B, C, D }
    enum Enum7 : uint { A, B, C, D }
    enum Enum8 : ulong { A, B, C, D }
    

    sizeof(Enum1): 1
    sizeof(Enum2): 2
    sizeof(Enum3): 4
    sizeof(Enum4): 8
    sizeof(Enum5): 1
    sizeof(Enum6): 2
    sizeof(Enum7): 4
    sizeof(Enum8): 8

    Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum1))): 1
    Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum2))): 2
    Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum3))): 4
    Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum4))): 8
    Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum5))): 1
    Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum6))): 2
    Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum7))): 4
    Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum8))): 8

    【讨论】:

    • 完美。这正是我一直在寻找的。它可以工作,尽管它并不漂亮,但有一条评论显示了更简洁的方式并说明了为什么这里没有使用它,它会很棒。谢谢你。这正是我在询问 Stackoverflow 时所希望的。
    【解决方案2】:

    正确的解决方案是在此行之前添加注释,说明该工具生成的警告不正确。这将防止未来的维护者感到困惑并试图修复未损坏的东西。

    【讨论】:

    • 这如何解决他的问题?
    • Resharper 中的 bug 没有修复,真的没有解决方案,是吗?
    • 不,没有修复。但是解决方法?也许。这就是他要问的。
    • 我是说解决方法不如简单地在源中指出生成的警告不正确那么有效。我怀疑任何解决方法都会导致代码更具可读性、可维护性。
    • 他试图避免错误报告,以便他可以看到实际发生错误的时间。这个答案是非答案。
    【解决方案3】:

    我想(如果你真的,真的想)你可以在枚举上使用 switch/case。但我的猜测是 sizeof 的存在是有原因的。

    【讨论】:

      【解决方案4】:

      如果您对获取枚举的底层数据对象的大小感兴趣,也许更好的方法是首先获取 System.Type 对象。

      Type type = typeof (MyEnum);
      int enumSize = sizeof (Enum.GetUnderlyingType (type));
      

      【讨论】:

        【解决方案5】:

        您可以在 ReSharper 中忽略它,但这有点痛苦,并且会妥协/更改您的设计。您可以将 Enum 定义和获取大小(使用 sizeof)的方法放入类中自己的文件中,然后单击 ReSharper > Options... > Code Inspection > Settings > Edit Items to Skip 然后选择该文件(我我正在使用 R# 5.1)。

        显然您不会进行代码分析,但您仍然可以进行代码格式清理。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-11
          • 2014-08-31
          • 1970-01-01
          • 1970-01-01
          • 2014-08-19
          • 2010-11-29
          • 2011-06-21
          • 1970-01-01
          相关资源
          最近更新 更多