2010-11-18 59 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)。

顯然你不會得到代碼分析,但你仍然得到代碼格式清理。