C# Language Gotcha: retourner la ressource que vous disposez


Exemple

Ce qui suit est une mauvaise idée car cela éliminerait la variable de db avant de la renvoyer.

public IDBContext GetDBContext()
{
    using (var db = new DBContext())
    {
        return db;
    }
}

Cela peut également créer des erreurs plus subtiles:

public IEnumerable<Person> GetPeople(int age)
{
    using (var db = new DBContext())
    {
        return db.Persons.Where(p => p.Age == age);
    }
}

Cela semble correct, mais le problème est que l'évaluation de l'expression LINQ est paresseuse et ne sera éventuellement exécutée que lorsque le DBContext sous-jacent aura déjà été supprimé.

Donc en bref, l'expression n'est pas évaluée avant de quitter l' using . Une solution possible à ce problème, qui fait encore l' utilisation de l' using , est de provoquer l'expression d'évaluer immédiatement en appelant une méthode qui énumérera le résultat. Par exemple ToList() , ToArray() , etc. Si vous utilisez la version la plus récente d'Entity Framework, vous pouvez utiliser les contreparties async telles que ToListAsync() ou ToArrayAsync() .

Vous trouverez ci-dessous l'exemple en action:

public IEnumerable<Person> GetPeople(int age)
{
    using (var db = new DBContext())
    {
        return db.Persons.Where(p => p.Age == age).ToList();
    }
}

Il est important de noter qu'en appelant ToList() ou ToArray() , l'expression sera évaluée avec empressement, ce qui signifie que toutes les personnes ayant l'âge spécifié seront chargées en mémoire même si vous ne les parcourez pas.