53 votes

L'instruction C# using peut-elle être écrite sans les accolades ?

Je parcourais le code C# d'un collègue de travail aujourd'hui et j'ai trouvé ce qui suit :

    using (MemoryStream data1 = new MemoryStream())
    using (MemoryStream data2 = new MemoryStream())
    {
        // Lots of code..........
     }

J'avais toujours vu le using suivie d'une paire d'accolades qui définissent la portée de la vie de l'objet. Mon collègue qui a écrit le code a dit que les accolades de l'instruction data1 using n'étaient pas nécessaires et le code faisait la même chose que s'ils étaient présents et imbriquait l'instruction data2 using déclaration. Alors, que se passe-t-il lorsque les accolades sont omises ?

2 votes

Bien que vous puissiez le faire, comme le montrent les réponses, je pense que vous ne devriez pas le faire, pour des raisons de lisibilité. Pour moi, c'est comme envelopper les blocs if/else/while/lock/etc. dans des accolades - même s'ils ne sont pas nécessaires, c'est beaucoup plus facile à lire.

15 votes

A mon avis, empilé using Les déclarations, comme ci-dessus, sont lejos plus facile à lire que des éléments imbriqués using déclarations. En particulier dans les cas où vous enchaînez 3-4 Streams/StreamReaders pour effectuer un seul ensemble d'opérations.

3 votes

@Joel : Peut-être que comme toute chose, la situation spécifique doit être prise en considération. Si ce n'était que deux, mon avis est de les emboîter absolument avec un appareil dentaire. Si nous parlons de 4 comme vous le dites, peut-être que stacked est la meilleure approche. Mais la première fois que vous avez besoin d'accéder à data1 avant la création de data2, cela signifie changer la lisibilité du code au lieu de simplement ajouter une ligne de code.

110voto

Albin Sunnanbo Points 30722

Oui, vous pouvez aussi les mettre dans une seule déclaration d'utilisation :

using (MemoryStream data1 = new MemoryStream(), 
                    data2 = new MemoryStream())
{
    // do stuff
}

0 votes

Je suis presque sûr que le comportement de cette construction est différent dans certains cas. Je ne me souviens plus exactement pourquoi, mais je crois l'avoir lu dans un des livres de Bill Wagner.

0 votes

Lequel est éliminé en premier dans ce cas ?

28 votes

Notez que vous ne pouvez placer plusieurs objets dans un même using s'ils sont tous du même type, MemoryStream dans ce cas.

21voto

Chuck Conway Points 10293

Les mêmes règles s'appliquent lorsque vous omettez les accolades dans un fichier de type for ou un if déclaration.

D'ailleurs, si vous réfléchissez au code compilé, l'élément compilateur Le décompilateur ajoute les accolades.

2 votes

Une différence est que, lors de l'imbrication for on mettrait en retrait la déclaration intérieure, mais les déclarations imbriquées using sont généralement alignés à gauche. Il s'agit d'une question de convention commune, et non de syntaxe du langage, bien sûr.

7 votes

+1, point de pinaillage : Le compilateur n'ajoute pas réellement les accolades, le décompilateur les met.

0 votes

@JaredPar Merci pour la clarification. Je ne le savais pas.

18voto

Stephen Points 2878

Exactement ce qu'il a dit. Le code ci-dessus est exactement le même que celui écrit :

using (MemoryStream data1 = new MemoryStream()) 
{
    using (MemoryStream data2 = new MemoryStream())
    {
        // Lots of code
    }
}

Vous pouvez omettre les accolades après une instruction if/else/for/while/using/etc tant qu'il n'y a qu'une seule commande dans l'instruction. Exemples :

// Equivalent!
if (x==6) 
    str = "x is 6";

if(x == 6) {
    str = "x is 6";
}

// Equivalent!
for (int x = 0; x < 10; ++x) z.doStuff();

for (int x = 0; x < 10; ++x) {
    z.doStuff();
}

// NOT Equivalent! (The first one ONLY wraps the p = "bob";!)
if (x == 5) 
p = "bob";
z.doStuff();

if (x == 5) {
   p = "bob";
   z.doStuff();
}

4voto

Jimmy Hoffa Points 3651

C'est viable mais risqué, car si quelqu'un décide plus tard qu'il veut faire quelque chose à data1 avant que d'autres choses ne lui arrivent, il pourrait le placer juste après l'utilisation de data1, ce qui le sortirait de la portée entière de l'utilisation de data2. Cela casserait probablement la compilation mais reste un raccourci syntaxique risqué et inutile

12 votes

Cette personne devrait probablement envisager une autre ligne de travail.

1 votes

@spoulson : c'est vrai pour beaucoup de gens qui ne le font pas, mais c'est quand même notre travail de garder le code aussi maintenable par d'autres que possible, de peur que d'autres mettent des bugs dans notre code .

3voto

fletcher Points 5739

Exactement ce que votre collègue a dit, c'est l'équivalent de l'imbrication des déclarations. La disposition pour data2 serait appelée immédiatement avant la fonction dispose pour data1 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X