2010-11-18 118 views
6

在C#中,我有一些与UAC提升相关的“安全”API代码。它涉及到得到一个枚举的大小(如下)C#sizeof(enum)的替代? (解决方法resharper虚假错误)?

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月以来被忽略的日志。进一步看,他们至少有两个这种记录可以追溯到几年的其他实例,两者都以“无复制”状态被解雇。我不想注册他们的跟踪器来投票给这个bug。多年来我仍然可以屏住呼吸。最快的方法就是解决这个问题。

什么是最好的选择,仍然是正确的,有最小的机会导致维护人员后来有任何麻烦?

我可以硬编码它:

int myEnumSize = 4; 

的是,有更多的正确的解决方案? - 哪个不使用sizeof(枚举)?

BTW:

Marshal.SizeOf() 

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

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

回答

6

相貌丑陋,但可能工作:约翰Gietzen

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


编辑:
证明:

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

确认工作。 – 2010-11-18 21:05:58

+1

完美。这正是我所期待的。它的工作原理,即使它不漂亮,评论显示更简洁的方式,并指出为什么它没有在这里使用,这将是伟大的。谢谢。这正是我在问Stackoverflow时所希望的。 – DanO 2010-11-18 21:53:49

1

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

+0

这是如何解决他的问题? – 2010-11-18 20:49:38

+0

在修复Resharper中的缺陷之后,确实没有解决方案,是吗? – cdhowie 2010-11-18 20:50:34

+0

不,没有修复。但是一个解决方法?也许。这就是他所要求的。 – 2010-11-18 20:52:18

0

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

0

如果您有兴趣获取枚举的基础数据对象的大小,或许更好的办法是首先获取System.Type对象。

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

你可以忽视它在ReSharper的,但它是一个有点疼痛和妥协的/改变你的设计。您可以将Enum定义和一种方法在自己的文件中获取类的大小(使用sizeof),然后单击ReSharper> Options ...> Code Inspection> Settings> Edit Item to Skip,然后选择该文件(I使用R#5.1)。

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