Не получается никак запихнуть List в using.
namespace myNamespace
{
using System.Collections.Generic;
public class Program
{
public static void Main(string[] args)
{
using (List<MyClass> list = new List<MyClass>())
{
list.Add(new MyClass(1, "first", "instance"));
}
}
}
public class MyClass
{
public int Id { get; set; }
public string field1 { get; set; }
public string field2 { get; set; }
public MyClass() { }
public MyClass(int id, string field1, string field2)
{
Id = id;
this.field1 = field1;
this.field2 = field2;
}
}
Вот весь код. На экземпляре списка же по логике должнен вызываться метод Dispose(), но он почему-то не вызывается. Пишет какую-то ошибку. Объясните пожалуйста в чём тут может быть проблема?
Естественно не получается. List - это класс-коллекция, который не реализовывает интерфейс IDisposable, при использовании конструкции using, на сколько нам всем известно, при выходе из блока using неявно вызывается метод Dispose() из одноимённого интерфейса на экземпляре класса, инициализируемого в параметре блока using. Само собой, если инициализируемый класс в блоке using не реализовывает данный интерфейс, то и метод вызвать , хоть явно, хоть неявно - будет невозможно.
Лучший способ диспоузнуть список - не делать этого. Предоставьте это всё сборщику мусора. Пусть он сам заберёт всё ненужное пр ипрохождении цикла сборки мусора.
С другой стороны если вам всё же пришлось очищать ваш список экстренным путём через Dispose() - реализуйте расширяемый метод для Dispose в интерфейса IEnumerable. Так как любая системная коллекция реализовывает данный интерфейс - ваш список также будет иметь возможность использовать его.
public static void DisposeSequence<T>(this IEnumerable<T> source)
{
foreach (IDisposable disposableObject in source.OfType(System.IDisposable))
{
disposableObject.Dispose();
};
}