SORU
19 Kasım 2012, PAZARTESİ


Herhangi bir IEnumerable<T> kullanıyorum yardımcı olduğu dikkate almak gerekir mi?

Son zamanlarda çeşitli Etmeniz uzatma yöntemleri (Where, Select, vb gibi) de olur IEnumerable<T> IDisposable dönüş olacak bana işaret oldu. Aşağıdaki True olarak değerlendirir

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

Where bir ifadenin sonuçlarını atmanız gerekiyor mu?

Her ne zaman ben bir yöntem IEnumerable<T>, Ben dönmeden (potansiyel olarak) onunla işim bittiğinde imha aradığınız için sorumluluk kabul diyorsun?

CEVAP
19 Kasım 2012, PAZARTESİ


Hayır, bu konuda endişelenmenize gerek yok.

IDisposable Bir Uygulama dönerler aslında uygulama bir detay - C Microsoft uygulamasında yineleyici engeller çünkü# bir derleyici oluşturmak için oldutekIEnumerable<T> IEnumerator<T> hem uygulayan yazın. İkincisi de görüyorsunuz ediliyor IDisposable, genişletir.

Örnek kod, bu göstermek için:

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;
    }
}

UnutmayınyapınIEnumerator<T> IDisposable uygulayan gerçeği dikkate alması gerekiyor. Açıkça yineleme yapmak her zaman, gerektiği gibi elden çıkarın. Eğer bir şey üzerinde yineleme ve her zaman olacak emin olmak istiyorsanız, örneğin,birdeğeri, bir şey gibi kullanabilirsiniz:

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 bir döngü bu, otomatik olarak, elbette yapacaktır.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bunnyboxx

    bunnyboxx

    17 NİSAN 2008
  • ChannelRichard

    ChannelRicha

    7 Kasım 2008
  • lane182videos

    lane182video

    6 EKİM 2011