2013-07-16 2 views
-1

В приведенном ниже примере ... Поскольку класс имеет интерфейс IDisposable, а сам класс - это только объекты памяти управления (а не неуправляемая память), поэтому в сценарии ниже внизу (см. Case # 1 и case # 2) - Каков правильный способ сделать удаление, когда это делается с объектами списка?Каков правильный способ использования IDisposable?

public class VehicleA : IDisposable 
{ 
    public void Dispose() { } 

    public string Year {get;set;} 
    public string Make {get;set;} 
    public string Model {get;set;} 
} 
public class repositoryVehicle() 
{ 
    public List<VehicleA> VehicleLookup() 
    { 
     List<VehicleA> returnVehicles = new List<Vehicle>(); 

     returnVehicles.Add(new VehicleA { Year="2007", Make="Ford", Model="Mustang" }); 
     returnVehicles.Add(new VehicleA { Year="2004", Make="Chevy", Model="Blazer" }); 

     return returnVehicles; 
    } 
} 

//Case #1... 
foreach(var v in repositoryVehicle.VehicleLookup()) 
{ 
    //v.Year... 
} 

//Case #2... 
List<VehicleA> vehicles = new List<VehicleA>(); 
vehicles = repositoryVehicle.VehicleLookup(); 
//vehicles[x].Year... 
+9

Если ваш класс не имеет ничего, что нуждается в особых очистках, почему это реализовать IDisposable? –

+3

Возможно, релевантно: http://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface – Chris

+0

взгляните на это SO Q & A на [когда использовать IDisposable с управляемыми ресурсами] (http: // stackoverflow.com/questions/3908463/idisposable-interface) – jltrem

ответ

2

Шаблон размещения используется только для объектов, которые получают доступ к неуправляемым ресурсам. Это связано с тем, что сборщик мусора очень эффективен при утилизации неиспользуемых управляемых объектов.

Там нет никакой выгоды производительности при реализации метода Dispose на типов, которые используют только управляемые ресурсы (такие как массивы), поскольку они автоматически утилизирован сборщиком мусора. Используйте метод Dispose , в основном, для управляемых объектов, которые используют собственные ресурсы, и для объектов COM, которые подвержены .NET Framework. Управляемые объекты , которые используют собственные ресурсы (такие как класс FileStream), реализуют интерфейс IDisposable.

http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx

+0

Array и 'List <>' не управляются ресурсами. Это просто память. –

+0

"* Это связано с тем, что сборщик мусора очень эффективен при утилизации неиспользуемых управляемых объектов. *« Я хотел бы квалифицировать это. GC эффективен, только если памяти достаточно. Например, см. Здесь: http://sealedabstract.com/rants/why-mobile-web-apps-are-slow/ –

+1

* «Шаблон размещения используется только для объектов, которые получают доступ к неуправляемым ресурсам» * - Я также использовал 'IDisposable', чтобы убедиться, что события правильно отписаны, иначе они могут вызвать утечку памяти. Я считаю, что дефект дизайна с событиями, хотя - подписки на события * должны быть слабыми ссылками. –

Смежные вопросы