No C No Simple Statement

Qu’est-ce qu’une simple instruction Noop en C #, qui ne nécessite pas la mise en œuvre d’une méthode? (Cependant, les méthodes Inline / Lambda sont acceptables.)

Mon cas d’utilisation actuel: je veux occuper le blocage d’un try-catch, afin de pouvoir y accéder pendant le débogage et inspecter l’exception.
Je suis conscient que je devrais probablement gérer / consigner l’exception de toute façon, mais ce n’est pas le but de cet exercice.

Si vous voulez vraiment noop, alors cela définit une action sans nom qui ne fait rien, puis l’invoque, sans que rien ne se produise:

 ((Action)(() => { }))(); 

L’instruction vide standard / opération noop en c # est

 ; 

un péché:

 if (true) ; 

( documentation pertinente )

cela s’adresse spécifiquement à votre cas d’utilisation (il suffit de placer un point d’arrêt sur la ligne; ou de procéder autrement), est minimal, et est directement pris en charge par l’environnement uniquement dans ce but (donc même si vous faites des choses complexes , comme si vous regardiez la source compilée, vous n’auriez pas à faire de bruit supplémentaire / etc .. du compilateur / optimiseur / etc …) – et a l’avantage supplémentaire de mettre en place un avertissement, rappelant effacez-le de votre code lorsque vous avez terminé le débogage / le passage en production

Si vous voulez entrer dans la méthode, vous pouvez coder en dur un point d’arrêt:

 System.Diagnostics.Debugger.Break(); 

Sinon, si vous ne comstackz pas en mode release, la ligne suivante émettra un IL sur lequel vous pouvez vous connecter:

 var a = 1; 

Vous pouvez également écrire un Debug.Break () spécifique à votre ordinateur:

 [Conditional("DEBUG")] [Obsolete("Please remove me before checkin.")] public static void Break() { #IF DEBUG if (Dns.GetHostName() == "PROTECTORONE") Debugger.Break(); #ENDIF } 

Notez qu’en raison de [Conditional("DEBUG")] cette méthode ne sera pas appelée dans les sites d’appels lors d’une génération RELEASE.

Vous pouvez écrire une fonction qui ne fait rien.

 public static void Noop() { } 

Vous pouvez simplement écrire:

 catch { ; } 

L’instruction vide avec un seul point-virgule est le C # NOOP.

Que diriez-vous:

 GC.KeepAlive(e); 

e est la variable d’exception?

(Je n’ai pas essayé de définir un sharepoint rupture dans la déclaration de capture elle-même. Il semble que vous devriez pouvoir le faire, précisément pour cette raison. Mais que cela fonctionne ou non, c’est une question différente.)

Ou un peu plus cryptiquement, en supposant que vous ayez déjà une directive using pour System.LINQ :

 "".AsEnumerable(); 

En plus des réponses qui répondent directement à la question.


Si vous voulez juste faire une pause, vous pouvez toujours mettre le point d’arrêt sur l’ouverture { ou la fermeture } du bloc catch .

Pourquoi sur-ingénierie cela?

 var x = 0; 

fonctionne très bien 🙂

Eh bien le NOP en C # existe, comme en C et est ';' et sa définition correcte est ” l’instruction vide “, mais pour l’usage que vous souhaitez, il est suffisant de placer le point d’arrêt dans le crochet de fermeture … Il n’y a aucun besoin de garder Alive vivant, car la durée de vie d’une référence d’object dans une La méthode est étendue à la fin de la méthode lorsque le débogueur est attaché. Donc vous avez simplement besoin d’écrire

 catch(Exception exception) { } 

et placez le point d’arrêt sur le crochet de fermeture et consultez le contenu de l’exception.

L’opération d’instruction / noop vide standard en C # est ; comme dans if (true) ; .
– les bleuets

Mais en utilisant cette norme ; en tant que twig d’une instruction if , MS Visual Studio 2010 affiche un avertissement: “instruction vide erronée possible”. (Avertissement CS0642, même si VS2010 ne me dit pas cela ni ne renvoie à l’aide réelle pour l’avertissement.)

Pire encore, la spécification du langage MSDN C # ne mentionne pas le fait que coder cette instruction vide en tant que twig d’une instruction if provoque l’avertissement CS0642 “Instruction erronée possible erronée”. (Attention, c’est une “mauvaise forme”, potentiellement ambiguë.)

Pire encore, il semble que VS2010 ne fournisse aucun moyen de supprimer immédiatement un avertissement individuel. Je devrais insérer l’ #pragma warning disable CS0642 avant la ou les lignes et [facultatif] l’ #pragma warning disable CS0642 après. Pour moi, c’est plus laid que l’avertissement. Je ferais mieux d’utiliser { } à la place de ; . (Je pourrais utiliser un remplacement qui est un peu moins laid.)

J’ai cherché ici un “C # no-op” parce que je voulais une alternative à la “déclaration vide” pour éliminer cet avertissement. Je n’ai pas besoin d’un sharepoint contrôle. Je veux juste une chose absolument absolue qui ne soit pas ambiguë comme “la déclaration vide”.

L’alternative ne doit pas provoquer un autre avertissement. int u; est inutile car cela provoque un avertissement “La variable ‘u’ est déclarée mais jamais utilisée”. int u = 0; n’est pas bon car cela provoque l’avertissement “La variable ‘u’ est affectée mais sa valeur n’est jamais utilisée”.

Si noop; (ou similaire) ont été ajoutés en tant qu’instruction vide non ambiguë (PAS une définition de macro), ce serait formidable.

Si noop(); (ou similaire) était une fonction avec un corps vide (qui peut disparaître complètement quand le compilateur le met en ligne), ce serait presque génial.

Lorsque la twig n’est qu’une déclaration, j’ignore souvent les { et } LINES qui les entourent car elles ne sont pas nécessaires et étirent le code verticalement, ce qui le rend plus difficile à lire. L’incohérence dans le langage est que je ne peux pas omettre les lignes { et } qui l’entourent lorsqu’elles entourent des instructions ZERO. Je peux compacter les deux lignes en { } sur la même ligne, mais c’est incohérent. Je pense ; sur une ligne est la solution la plus soignée, et elle ne devrait PAS provoquer un avertissement pour des motifs [non déclarés] de “mauvaise forme”. Je pense que l’avertissement CS0642 aurait dû être désactivé par défaut. Je pense que le code suivant devrait être acceptable tel quel:

 if (condition1) action1; else if (condition2) ; // (do nothing) else if (condition3) action3; else if (condition4) ; // (do nothing) else if (condition5) action5; else action99; 

(J’ai regretté de ne pouvoir écrire ceci sous forme de commentaire car je n’avais pas encore “50 ans de réputation à commenter”. Maintenant que je peux commenter, à 2K octets, il est trop long pour un commentaire de 1,5 Ko, alors ça rest ici .)

Essayez-vous de déboguer une version (optimisée)? C’est normalement l’optimiseur qui supprime les variables non référencées et les blocs vides.

Deux solutions:

  • Déboguer dans une version de débogage.
  • Placez un point d’arrêt sur la catch elle-même et utilisez $exception – créée par le débogueur pour référencer l’exception en vol – dans la fenêtre de l’outil Locals.

Je sais que c’est une vieille question et, techniquement, cette réponse ne concerne pas le cas d’utilisation du demandeur. Cependant, il existe une instruction NOOP dans CIL, qui est nop . A titre expérimental, prenons l’application CIL suivante.

 .assembly extern mscorlib {} .assembly Test { .ver 1:0:1:0 } .module test.exe .method static void main() cil managed { .maxstack 1 .entrypoint nop nop nop nop ret } 

Si vous comstackz l’application et que vous la décomstackz avec un outil tel que ILSpy, en C #, le contenu de la méthode main () est le suivant:

 static void main() { } 

Comme vous pouvez le constater, il n’y a rien là-bas. Cependant, si nous voulons vérifier que le compilateur CIL n’a pas optimisé ces instructions nop , nous pouvons afficher notre application dans le code IL décompilé dans ILSpy, et voici ce que nous voyons pour la méthode principale:

 .method static privatescope void main$PST06000001 () cil managed { // Method begins at RVA 0x2050 // Code size 5 (0x5) .maxstack 1 .entrypoint IL_0000: nop IL_0001: nop IL_0002: nop IL_0003: nop IL_0004: ret } // end of method ''::main 

CIL est en train de comstackr les instructions nop dans l’ensemble. C # n’ayant pas d’implémentation de cette instruction, ces nop ne sont pas affichés dans le code C # désassemblé.

Je n’ai pas de licence pour Reflector, mais j’imagine que si vous décompiliez ces fichiers binarys avec Reflector, vous obtiendrez une sortie similaire pour C #.

Solution fiable

 try { blablablablaStatemnt(); } catch(Exception ex) { #IF DEBUG Debugger.Break(); #END IF } 

Aussi simple que ça!

Autrement

points d’arrêt

peut être très utile;

J’aime bien ça, juste parce que ça déroutera quiconque le rencontrera:

 catch (SomeException e) { lock(e); }