C # sizeof (enum) альтернатива? (чтобы обойти ложную ошибку) - PullRequest
6 голосов
/ 18 ноября 2010

В C # у меня есть некоторый "безопасный" код API, связанный с повышением UAC. Это включает получение размера перечисления (следующим образом)

int myEnumSize = sizeof (MyEnum);

Сам код действителен, компилируется, работает правильно и т. Д. Но Resharper ложно помечает его как ошибку («Невозможно использовать небезопасную конструкцию в безопасном контексте») в решении. ( Начиная с версии 2.0 C #, применение sizeof к встроенным типам больше не требует использования небезопасного режима. ) Мне нравится Resharper, и мне нравится анализ решения, но с этим кодом в решении I в углу есть большая красная точка, которая заставляет меня всегда думать, что что-то сломано. Если я скажу resharper игнорировать эту ошибку, она вернется через несколько минут.

Я бы поднял проблему с JetBrains, но я посмотрел на их трекер, и у них уже есть одна запись, которая игнорируется с марта. Если посмотреть дальше, у них есть по крайней мере два других случая, когда они регистрировались несколько лет назад, оба были уволены со статусом «без репро». Я не хочу подписываться на их трекер, чтобы проголосовать за эту ошибку. Я все еще мог задерживать дыхание годами. Самый быстрый путь вперед - это просто обойти проблему.

Какова лучшая альтернатива, которая все еще верна и имеет наименьший шанс вызвать у сопровождающего какие-либо проблемы позже?

Я мог бы жестко закодировать это так:

int myEnumSize = 4;  

Есть ли более правильное решение? - который не использует sizeof (enum)?

Btw:

 Marshal.SizeOf() 

полностью "безопасен", но возвращает неправильный размер.

PS. На рассматриваемый код сильно влияет демонстрационный код UACSelfElvation от Microsoft. Если вы хотите больше деталей. Но я не думаю, что они актуальны.

Ответы [ 5 ]

6 голосов
/ 18 ноября 2010

выглядит некрасиво, но может работать:

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.GetUnderlyingTytypeof (Enum6))): 2
Marshal.SizeOf (Enum.GetUnderlyingType (typeof (Enum7))): 4
Marshal.SizeOf (Enum.GetUnderlyingType (typeof (Enum8))): 8

1 голос
/ 18 ноября 2010

Правильным решением было бы добавить комментарий перед этой строкой о том, что предупреждение, сгенерированное инструментом, неверно. Это предотвратит смущение будущих сопровождающих и попыток исправить то, что не сломано.

0 голосов
/ 19 ноября 2010

Вы можете игнорировать это в ReSharper, но это немного болезненно и компрометирует / меняет ваш дизайн. Вы можете поместить определение Enum и метод для получения размера (используя sizeof) в классе в своем собственном файле и нажать ReSharper> Параметры ...> Проверка кода> Настройки> Изменить элементы, чтобы пропустить, а затем выбрать этот файл (I использую R # 5.1).

Очевидно, что вы не получите анализ кода, но вы все равно получите очистку формата кода.

0 голосов
/ 18 ноября 2010

Если вы заинтересованы в получении размера базового объекта данных перечисления, возможно, лучшим способом было бы сначала получить объект System.Type.

Type type = typeof (MyEnum);
int enumSize = sizeof (Enum.GetUnderlyingType (type));
0 голосов
/ 18 ноября 2010

Полагаю (если вы действительно, очень хотите), вы можете использовать переключатель / регистр при перечислении.Но я предполагаю, что sizeof существует по причине.

...