9
votes

Utiliser la déclaration avec essayer. Qu'advient-il de l'exemple d'utilisation de la déclaration?

Si j'ai un blocage d'un bloc entourant une déclaration de capture, ce qui va arriver à l'objet à l'intérieur de celle de la déclaration si le feu de capture devrait-il une exception? Considérez le code suivant:

using (IDatabaseConnectivityObject databaseConnectivityObject = new DbProviderFactoryConnectionBasicResponse())
{
    try
    {
        Foo();
    }
    catch (ArgumentNullException e)
    {
        throw;
    }
}


0 commentaires

5 Réponses :


7
votes

Nous supposons que FOO () échoue et que l'exception est tirée et efficace casse le programme DatabasConnectivityObject être disposé?

Oui, ce sera. Utilisation d'utilisations internes ESSAY-enfin , (Utilisation uniquement fonctionne pour ceux qui implémentent Idisposable )

de MSDN- Utilisation de la déclaration

L'utilisation de l'utilisation de l'utilisation garantie que le dispositif est appelé même si un Exception survient pendant que vous appelez des méthodes sur l'objet. Vous pouvez obtenir le même résultat en mettant l'objet à l'intérieur d'un bloc d'essai et Ensuite, appelez ensuite en un blocage; En fait, c'est comme ça que la Utilisation de la déclaration est traduite par le compilateur.


2 commentaires

Afin en effet l'utilisation de l'utilisation, essayez tout le code dans l'utilisation du bloc et appelez enfin myObject.Dispose () dans le bloc enfin que nous ne voyons pas?


@Cshaparpéré, absolument raison, c'est le cas. Vous pouvez voir un exemple plus détaillé sur le lien dans la réponse



3
votes

Oui Votre Utilisation de Block disposera de la DatabasEConnectivityObject, que vous ayez un bloc d'essai.

Vous dites à juste titre que l'utilisation du bloc est importante et que vous devez l'utiliser pour toutes les classes qui implémentent Idisposable pour s'assurer qu'ils sont éliminés correctement, même en cas d'exception.

de MSDN- Utilisation de la déclaration

L'utilisation de l'utilisation de l'utilisation garantie que le dispositif est appelé même si un Exception survient pendant que vous appelez des méthodes sur l'objet. Vous pouvez obtenir le même résultat en mettant l'objet à l'intérieur d'un bloc d'essai et Ensuite, appelez ensuite en un blocage; En fait, c'est comme ça que la Utilisation de la déclaration est traduite par le compilateur.


0 commentaires

3
votes

Lors de la mise en œuvre du à l'aide de Block, l'objet entre parenthèses sera disposé s'il implémente l'interface iDisposable

Il serait toujours disposé même si foo () a échoué.

L'objet à l'intérieur de l'instruction Utilisation doit implémenter l'interface Idisposable .

Aussi, ces questions "Utilisations de l'utilisation de C Sharp" et "Utilisation de la déclaration VS Essayez enfin" parler plus loin sur les utilisations et les aspects pratiques du en utilisant instruction.

Section 8.13 du C # Spécification de la langue Détails de l'utilisation de l'utilisation clairement. < / p>


0 commentaires

12
votes

Vous pouvez penser à en utilisant comme courte main pour essayer-enfin. Par conséquent, votre code est équivalent à: xxx

regardé de cette façon, vous pouvez voir que le Dispose () sera effectivement appelé si l'exception se lancent, car l'essai -Finalement est en dehors de la prise try.

C'est précisément pourquoi nous utilisons en utilisant .


0 commentaires

2
votes

Votre à l'aide du code code> est équivalent à

IDatabaseConnectivityObject databaseConnectivityObject = new IDatabaseConnectivityObject ();
try
{
//To do code here
}
finally
{
    if(databaseConnectivityObject!=null)
    {
       databaseConnectivityObject.Dispose();
    }
}


1 commentaires

Je pense que cela convient de souligner que le test NULL est généralement optimisé quand cela peut être, lorsqu'il leur expliquait. Quelqu'un pourrait être tenté de faire leur propre essai-enfin comme une micro-optimisation. Ce serait une mauvaise idée de toute façon (la réduction de la lisibilité ne vaudrait pas la peine), mais le fait que cela n'offrira même pas le minuscule avantage qu'ils le pensent, le découragera plus loin.