2010-03-03 6 views
9

Le C# language specification définit le vide-déclaration production de grammaire, ce qui me permet de faire quelque chose comme ceci:C# Déclaration vide

static void Main(string[] args) 
{ 
    ; ; ; 
} 

Pourquoi aurait Microsoft inclure cette production de grammaire dans le langage C#? A-t-il un but utile?

+1

Bien sûr, son utilité, voir http://thedailywtf.com/Articles/The-Speedup-Loop.aspx – Juliet

+0

La chose amusante est, la spécification de langage C# a déclaré qu'une unité de compilation est un fichier vide ou .... Tout le code est facultatif! –

Répondre

12
while (GetWhitespace(textStream)) 
    ; 
+0

Microsoft dit qu'il peut être utilisé pour un corps nul comme je l'ai déjà fait, mais mon outil de base de code (resharper) dit utiliser la méthode vide à la place, aussi les gens disent 'while();' est comme 'while() {;}' plus de code que 'while() {}' alors quoi de quoi et y a-t-il une surchauffe? – deadManN

3

C# hérite beaucoup de la famille C, où vous pouvez faire des choses comme

for (i = 0; i < n; v[i++] = 1); 

ou

while (testSomeCondition()); 

C'est, exécutez une boucle avec un corps vide où la « viande » est à l'intérieur des supports. Bien que l'on puisse débattre de leurs mérites et de leurs dangers, ce sont des idiomes de programmation assez communs dans le monde de la programmation C, donc cette rétrocompatibilité facilite l'apprentissage du C# par les programmeurs C/C++/Java.

5

Voici deux utilisations:

while(DoSomething()) ; 

et

void M() { 
    if(someCondition) goto exit; 
    // ... 
    exit: ; 
} 

Il y a beaucoup d'autres. C'est un appareil utile quand il n'y a rien à faire mais une déclaration est nécessaire.

+6

pas de GOTO s'il vous plaît! :) – Andrey

+21

non "pas GOTO s'il vous plaît! :)" s'il vous plaît! :) – jason

+6

Je supprimerais ce label goto et ferais 'goto exit' un' return; '. C'est horrible C#. – Dykam

0
if (b1) 
    if (b2) else; 
else 
    //code 

avec ce; Ce sera douloureux. mais ce n'est pas la meilleure façon d'écrire aussi. mais acceptable.

+1

Qu'est-ce qu'un cas d'utilisation? Ça a l'air plutôt inutile. – Dykam

+0

Pas pour chaque construction il y a un cas d'utilisation vraiment utile. Parfois, cela peut être pratique pour peaufiner le code et tester des choses. –

+0

c'est utile. Si vous voulez écrire autre, il sera un pour le plus intérieur si, comme support. mais je veux avoir d'autre dans le plus externe si. – Andrey

1

bonnes pratiques ou non, certaines personnes utilisent ceci:

while (!SomeCondition) 
    ; // <-- body of the while loop is an empty statement 
11

-je utiliser personnellement jamais une déclaration vide. Si je pour une raison bizarre voulais jouer au golf de code et écrire quelque chose comme

while(Foo(x++)) ; 

Je serais plus enclin à utiliser {} au lieu de; comme la "déclaration de ne rien faire". Je pense que c'est plus clair.

À peu près tout est là pour des raisons historiques. Il n'y a rien là que vous ne pouvez pas faire avec {}.

MISE À JOUR: J'ai juste pensé à un cas d'utilisation possible. Dans une construction de débogage, il vous permet de mettre un point d'arrêt quelque part dont vous êtes sûr que vous pouvez rompre, ce qui ne va pas avoir d'effet secondaire lorsque vous faites un pas. Si le code entourant le point de rupture est particulièrement compliqué, cela pourrait être utile.

MISE À JOUR: Je me trompe. Ça ne marche pas. Il déplace juste le point d'arrêt à la déclaration suivante. Comme c'est ennuyeux.

+4

Cependant, le golf est généralement par caractère, et '{}' a 1 caractère de plus que ';' ...: p – Tanzelax

+5

BTW, vous ne pouvez pas définir un point d'arrêt à une déclaration vide. Il saute le point d'arrêt et vous amène à la prochaine instruction non vide. Juste essayé ... –

+0

Si vous avez une seconde Eric pouvez-vous ajouter un commentaire à ma réponse sur cette question si je suis sur la base ou non. –

0

Eric Lippert C'est une bonne personne à demander. La plupart du temps, je suppose que c'est parce que cela ne causerait aucun mal et cela a simplifié leur gestion de la grammaire. Aussi, pourquoi restreindre les gens quand vous n'avez pas à le faire?

1

Pourquoi Microsoft inclurait-il cette production de grammaire en langage C#? La réponse à cette question est la suivante: C# est un langage de type C et pour faciliter la vie de différents développeurs MS a décidé de rendre la plupart des éléments de syntaxe de base compatibles avec d'autres langages de type c. et c'est bon.

0

Pour ce que ça vaut, une bonne règle de pouce est que vous devriez avoir intensifié par dans le débogueur chaque ligne de code que vous écrivez, au moins une fois pour chaque chemin d'exécution possible

ref: Possible mistaken empty statement

2

Permet de faire sortir des blocs de code IFDEF, et de construire le code environnant. par exemple

if(true){ 
#if(DEBUG) 
System.Console.WriteLine("Debug comment"); 
#endif 
} 

qui pourrait être écrit sous la forme d'un bloc vide, si vous n'aimez pas entre parenthèses:

if(true) 
#if(DEBUG) 
    System.Console.WriteLine("Debug comment") 
#endif 
; 
+0

Votre exemple ne montre pas réellement une instruction vide. – tomfanning

+1

Oui, {} me semble plutôt vide, à peu près aussi vide que {;}, le {} agit comme un marqueur de bloc, tout comme le; dans le second cas. –

+0

Alors que {} est "une instruction qui ne fait rien", ce n'est pas la "déclaration vide" C# telle que définie ici: http://msdn.microsoft.com/en-us/library/aa664739%28VS.71% 29.aspx – tomfanning

1

Ceci est une hypothèse, mais je suppose qu'il va à la grammaire de base pour le compilateur. En reliant cela à la théorie des ensembles, l '"ensemble vide" se trouve à l'intérieur de chaque ensemble. Que le ; est vraiment de définir un ensemble d'opérations lexicales qui doivent toujours définir le; qui accepterait également le cas de base qui est une déclaration vide.

+0

Tout d'abord, l'ensemble vide est un * sous-ensemble * de chaque ensemble, mais pas un * membre * de chaque ensemble; "à l'intérieur" est ambigu quant à ce que vous voulez dire. Deuxièmement, je ne suis pas votre point de vue sur la façon dont cela s'applique à la conception de la grammaire. –

+0

Cela fait un moment que ma théorie de compilateur a jamais été nécessaire, mais je crois que l'analyseur lexical qui évalue si les expressions sont valides sont comme A | [B] A | [B] C [B] A où A dans ce cas est le; –

0

Donc, un génie pourrait écrire for(;;) au lieu de while(true). Comme pour un test d'entrevue.

+2

Pensez que vous voulez dire 'pour (;;)'. car (;;;;) ne compilera pas. 'For' ignore vraiment les règles standard. – Dykam

+0

Oops-bonne prise. Voici un traitement sur leur équivalence au niveau de l'assemblage: http://stackoverflow.com/questions/2288856/when-implementing-an-infinite-loop-is-there-a-difference-in-using-while1-vs-fo –