gpt4 book ai didi

C# sizeof(enum) 替代方案? (解决 resharper false 错误)?

转载 作者:太空狗 更新时间:2023-10-29 21:30:46 26 4
gpt4 key购买 nike

在 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() 

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

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

最佳答案

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

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

关于C# sizeof(enum) 替代方案? (解决 resharper false 错误)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4219413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com