SORU
27 ŞUBAT 2012, PAZARTESİ


Kaynak olmayan sınıflar üzerinde uygulayan IDisposable için herhangi bir yararı var mı?

C# eğer bir sınıf, yönetici sınıf olarak, kendi kaynaklarına sahip değilse, : IDisposable sahip olmanın herhangi bir faydası var mı?

Basit bir örnek:

public interface IBoxManager
{
 int addBox(Box b);
}

public class BoxManager : IBoxManager
{
 public int addBox(Box b)
 {
  using(dataContext db = new dataContext()){
   db.Boxes.add(b);
   db.SaveChanges();
  }
  return b.id;
 }
}

Eğer aynı zamanda IDisposable uygulayan BoxManager kullanırken bellek kullanımı herhangi bir yararı olacak mı? public class BoxManager : IBoxManager , IDisposable

Örneğin:

BoxManager bm = new BoxManager();
bm.add(myBox);
bm.dispose();//is there benefit to doing this?

CEVAP
27 ŞUBAT 2012, PAZARTESİ


Bir tür IDisposable uygulama için sadece 2 nedeni vardır

  • Türü, artık kullanıldığında serbest olması gereken doğal kaynakları içerir
  • Bu tip 9 ** türü alanları içerir

Eğer ikisi de doğruysa, o zaman IDisposable uygulamak değil

EDİT

Birkaç kişi IDisposable başlangıç-bitiş veya bookended işlemleri uygulamak için iyi bir yol olduğunu belirtmiştik. IDisposable orijinal niyet olmasa da çok güzel bir desen sağlar.

class Operation {
  class Helper : IDisposable {
    internal Operation Operation;
    public void Dispose() {
      Operation.EndOperation();
    }
  }
  public IDisposable BeginOperation() {
    ...
    return new Helper() { Operation = this };
  }
  private void EndOperation() {
    ...
  }
}

Not: Bu model Lambda ile uygulamak için ilginç Bir yol. Yerine verme IDisposable tekrar kullanıcı ve umut yok unutmak için çağrı Dispose var onlara bir lambda hangi onlar çalıştırma işlemi ve yakın operasyon

public void BeginOperation(Action action) {
  BeginOperationCore();
  try {
    action();
  } finally {
    EndOperation();
  }
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • iNCH

    iNCH

    20 Temmuz 2009
  • tinycammonitor

    tinycammonit

    14 Aralık 2010
  • tsweeney79

    tsweeney79

    21 Ocak 2008