2010-11-18 8 views
6

En C# j'ai un code API "sûr" lié à l'élévation de l'UAC. Il consiste à obtenir la taille d'un ENUM (comme suit)C# sizeof (enum) alternative? (pour contourner fausse erreur de resharper)?

int myEnumSize = sizeof (MyEnum); 

Le code lui-même est valide, compile, fonctionne correctement, etc. Mais ReSharper faussement drapeaux il comme une erreur (« ne peut pas utiliser construction dangereux dans le contexte de sécurité ») dans la solution. (Starting with version 2.0 of C#, applying sizeof to built-in types no longer requires that unsafe mode be used.) J'aime Resharper, et j'adore l'analyse de solution, mais avec ce code dans la solution, j'ai un gros point rouge dans le coin qui me fait toujours penser que quelque chose est cassé. Si je dis à resharper d'ignorer cette erreur, il revient en quelques minutes. Je voudrais soulever le problème avec JetBrains, mais j'ai regardé sur leur traqueur et ils ont déjà un journal qui a été ignoré depuis mars. En regardant plus loin, ils ont au moins deux autres cas de ce passé depuis plusieurs années, les deux ont été rejetés avec un statut «sans repro». Je ne veux pas m'inscrire à leur tracker juste pour voter ce bug. Je pourrais encore finir par retenir ma respiration pendant des années. Le moyen le plus rapide est de contourner le problème.

Quelle est la meilleure alternative qui soit toujours correcte et qui a le moins de chance de causer des problèmes à un mainteneur plus tard?

je pourrais coder en dur à:

int myEnumSize = 4; 

Est-il y a une solution plus correcte? - qui n'utilise pas sizeof (enum)?

BTW:

Marshal.SizeOf() 

est complètement "sûr", mais renvoie la mauvaise taille.

PS. Le code en question est fortement influencé par le code de démonstration UACSelfElvation de Microsoft. Si vous voulez plus de détails. Mais je ne pense pas qu'ils sont pertinents.

Répondre

6

Attend laid, mais peut travailler:

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


Modifier par John Gietzen:
Preuve:

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

Travail confirmé. –

+1

Parfait. Ceci est exactement ce que je cherchais. Cela fonctionne, et même si ce n'est pas joli, avec un commentaire montrant la manière plus concise et indiquant pourquoi il n'a pas été utilisé ici, ce sera génial. Je vous remercie. C'est exactement ce que j'espérais en demandant à Stackoverflow. – DanO

1

La solution correcte serait d'ajouter un commentaire avant cette ligne indiquant que l'avertissement généré par l'outil est incorrect. Cela empêchera les futurs responsables de devenir confus et d'essayer de réparer quelque chose qui n'est pas cassé.

+0

Comment cela résout-il son problème? –

+0

A moins de corriger le bug dans Resharper, il n'y a vraiment pas de solution, n'est-ce pas? – cdhowie

+0

Non, pas de solution. Mais une solution de contournement? peut être. C'est ce qu'il demande. –

0

J'imagine (si vous voulez vraiment, vraiment), vous pouvez utiliser un commutateur/cas sur l'énumération. Mais je pense que le sizeof est là pour une raison.

0

Si vous souhaitez connaître la taille de l'objet de données sous-jacent de l'énumération, il serait peut-être préférable d'obtenir l'objet System.Type en premier.

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

Vous pouvez l'ignorer dans ReSharper, mais il est un peu d'une douleur et des compromis/change votre design. Vous pouvez mettre la définition Enum et une méthode pour obtenir la taille (en utilisant sizeof) dans une classe dans son propre fichier et cliquer sur ReSharper> Options ...> Code Inspection> Paramètres> Modifier les éléments à ignorer, puis sélectionnez ce fichier (I j'utilise R # 5.1).

Évidemment, vous n'obtiendrez pas d'analyse de code, mais vous obtenez toujours le nettoyage du format de code.