69 votes

Dois-je tenir compte de la disposition de tous IEnumerable<T> - Je l'utiliser?

On m'a fait remarquer que les différents extension Linq méthodes ( Where, Select, etc) retourner une IEnumerable<T> qui IDisposable. Le suivant prend la valeur True

new int[2] {0,1}.Select(x => x*2) is IDisposable

Ai-je besoin de disposer des résultats d'un Where expression?

Chaque fois que j'appelle une méthode retournant IEnumerable<T>, suis-je (potentiellement) en acceptant la responsabilité de l'appelant en disposer quand j'ai fini avec elle?

83voto

Jon Skeet Points 692016

Non, vous n'avez pas besoin de vous inquiéter à ce sujet.

Le fait qu'ils rendent l' IDisposable mise en œuvre est un détail d'implémentation - c'est que l'itérateur de blocages dans la mise en œuvre de Microsoft de le compilateur C# arriver à créer un seul type qui implémente les deux IEnumerable<T> et IEnumerator<T>. Ce dernier s'étend IDisposable, ce qui est pourquoi vous voyez.

Exemple de code pour illustrer ceci:

using System;
using System.Collections.Generic;

public class Test 
{
    static void Main() 
    {
        IEnumerable<int> foo = Foo();
        Console.WriteLine(foo is IDisposable); // Prints True
    }

    static IEnumerable<int> Foo()
    {
        yield break;
    }
}

Notez que vous ne devez prendre note du fait que l' IEnumerator<T> implémente IDisposable. Donc, à tout moment vous parcourez explicitement, vous devriez vous en débarrasser de manière appropriée. Par exemple, si vous souhaitez effectuer une itération sur quelque chose et d'être sûr que vous aurez toujours une valeur, vous pouvez utiliser quelque chose comme:

using (var enumerator = enumerable.GetEnumerator())
{
    if (!enumerator.MoveNext())
    {
        throw // some kind of exception;
    }
    var value = enumerator.Current;
    while (enumerator.MoveNext())
    {
        // Do something with value and enumerator.Current
    }
}

( foreach Boucle se faire automatiquement cela, bien sûr.)

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