11
votes

Tous les objets sont-ils créés en ligne dans une déclaration «à l'aide»?

Ceci peut être répondu ailleurs, mais après avoir effectué un peu de recherche, je n'ai pas beaucoup trouvé sur le sujet en dehors du normal en utilisant le contexte .

Je suis curieux si tous les objets créés dans un à l'aide du bloc sera éliminé ainsi que l'objet d'origine.

ici est le contexte:

normalement je ferais quelque chose comme ceci: xxx

Je sais que les deux < Code> conn et cmd sortez de la portée à ce stade et sont éliminés en raison du charmant en utilisant le mot-clé .

Je suis curieux si les mêmes règles d'élimination s'appliqueraient à l'instruction suivante: xxx

serait le sqlconnection objet qui était créé en ligne dans le à l'aide de STATION soit éliminé lorsque cmd est hors de portée et est éliminé car il est associé à l'objet?

aussi ce que être syntaxiquement préféré? Personnellement, je pense que le 2e est plus propre, mais je crois comprendre que la lisibilité peut venir jouer ici aussi.


1 commentaires

@Fabiomarcolini Bah, j'ai eu un sentiment que cela pourrait déjà exister, je ne pouvais tout simplement pas trouver le bon terme de recherche de la bonne recherche.


4 Réponses :


10
votes

Pour votre deuxième code, Dispose ne sera pas appelé sur SQLConnection instance lorsque le flux est laisse à l'aide de Sauf SQLCOMMAND.Dispose () Faites-le en interne (et non, ce n'est pas).

Selon la spécification (8.13), Utilisation (ResourceType ressource = Expression) est transformée en: xxx

dans votre code, ressource est sqlcommand , et c'est celui-ci Dispose est appelé .


4 commentaires

Ok, alors cela ne serait pas le moyen préféré de gérer cela? Ou existe-t-il un moyen de disposer de l'associé sqlconnection dans ce cas?


"Sauf si SQLCOMMAND.Dispose () le faire en interne" - il ne le fait pas en interne.


@Évanl Utilisez deux à l'aide des blocs , comme dans votre premier code.


Merci, j'ai pensé que c'était le cas (mon instinct me disait "ne le fais pas!") Alors pensais que je demanderais =)



4
votes

NO.

en utilisant Les instructions s'appliquent uniquement aux ressources déclarées directement dans la déclaration; pas à d'autres allocations de l'initialisateur.

Vous avez besoin d'un distinct à l'aide de la déclaration pour chaque ressource.


0 commentaires

2
votes

Selon MSDN , ce code:

{
    SqlCommand temp = new SqlCommand(commandText,
        new SqlConnection(ConnectionString));
    try
    {
        // ...
    }
    finally
    {
        if (temp != null)
            ((IDisposable)temp).Dispose();
    }
}


0 commentaires

2
votes

Certainement, il y a déjà des réponses qui explique cela correctement. Ceci est couvert par la spécification mentionnée par d'autres.

Mais vous pourriez simplement l'essayer. Voici un exemple: xxx

sortie: xxx

(bien sûr si vous nichez deux en utilisant Les instructions, comme dans à l'aide de (var intérieur = nouvelle disposition ("intérieure", null)) { en utilisant (nouvelle disposition ("extérieure", interne)) {...}} , le Dispose est appelé sur les deux objets.)


0 commentaires