C#sizeof(枚举)替代? (解决方法resharper false error)?

时间:2010-11-18 20:44:20

标签: c# interop resharper sizeof

在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(枚举)?

顺便说一下:

 Marshal.SizeOf() 

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

PS。问题中的代码很大程度上受到Microsoft的UACSelfElvation演示代码的影响。如果您想了解更多细节。但我不认为它们是相关的。

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我想(如果你真的,真的想)你可以在枚举上使用开关/案例。但我的猜测是尺寸是有原因的。

答案 3 :(得分:0)

如果您对获取枚举的基础数据对象的大小感兴趣,可能更好的方法是首先获取System.Type对象。

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

答案 4 :(得分:0)

你可以在ReSharper中忽略它,但它有点痛苦并且妥协/改变你的设计。您可以将Enum定义和方法放在其自己的文件中的类中以获取大小(使用sizeof),然后单击ReSharper&gt;选项......&gt;代码检查&gt;设置&gt;编辑要跳过的项目,然后选择该文件(我正在使用R#5.1)。

显然你不会得到代码分析,但你仍然可以清理代码格式。