125 votes

Existe-il des effets secondaires de retour à l'intérieur de la à l'aide de ()?

De retour d'une méthode de la valeur à partir de l'intérieur à l'aide d'instruction qui obtient un DataContext semble fonctionner toujours fine, comme ceci:

public static Transaction GetMostRecentTransaction(int singleId)
{
    using (var db = new DataClasses1DataContext())
    {
        var transaction = (from t in db.Transactions
                              orderby t.WhenCreated descending
                              where t.Id == singleId
                              select t).SingleOrDefault();
        return transaction;
    }
}

Mais j'ai toujours l'impression que je devrais être la fermeture de quelque chose avant de me sortir de l'aide de crochets, par exemple par la définition de la transaction avant de l'instruction à l'aide, c'est faire le valeur à l'intérieur des crochets, et ensuite de retour après les crochets.

Serait la définition et le retour de la variable en dehors de l'aide de crochets, de meilleures pratiques ou de conserver les ressources, de quelque façon?

163voto

Jon Skeet Points 692016

Non, je pense que c'est plus clair de cette façon. Ne vous inquiétez pas, Dispose s'appelle toujours "sur le chemin" -, et seulement après que la valeur de retour est entièrement évaluée. Si une exception est levée à tout moment (y compris l'évaluation de la valeur de retour) Dispose s'appelle toujours trop.

Alors que vous avez certainement pu prendre la route plus longue, c'est deux lignes supplémentaires que juste d'ajouter les fichiers inutiles et extra contexte de garder une trace de (mentalement). En fait, vous n'avez pas vraiment besoin de la variable locale supplémentaires - même si elle peut être utile en termes de débogage. Vous pourriez simplement:

public static Transaction GetMostRecentTransaction(int singleId)
{
    using (var db = new DataClasses1DataContext())
    {
        return (from t in db.Transactions
                orderby t.WhenCreated descending
                where t.Id == singleId
                select t).SingleOrDefault();
    }
}

En effet, je pourrais même être tentés d'utiliser la notation point, et de mettre l' Where condition au sein de l' SingleOrDefault:

public static Transaction GetMostRecentTransaction(int singleId)
{
    using (var db = new DataClasses1DataContext())
    {
        return db.Transactions.OrderByDescending(t => t.WhenCreated)
                              .SingleOrDefault(t => t.Id == singleId);
    }
}

31voto

astander Points 83138

Jetez un oeil à cette

La compréhension de la "aide' instruction en C#

Le CLR convertit votre code MSIL. Et l'instruction à l'aide obtient traduit en un essai et enfin le bloc. C'est la façon dont l'instruction à l'aide est représenté dans IL. Une aide l'énoncé est traduit en trois pièces: acquisition, d'utilisation et de l'élimination. La ressource est d'abord acquis, alors que l'utilisation est clos dans une instruction try avec un enfin la clause. L'objet devient alors éliminés dans la clause finally.

6voto

Mitch Wheat Points 169614

Il y a pas d' effets secondaires de retour à l'intérieur de la using() déclaration.

Si elle rend plus lisible le code est un autre débat.

0voto

Kerido Points 1950

Je pense que c'est du pareil au même. Il n'y a rien de mauvais dans le code. L' .NET framework ne serait pas de l'endroit où l'objet est créé. La chose qui importe est de savoir s'il est référencé ou pas.

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