Почему я должен осуществлять IDisposable в C#?

Я не заканчиваю понимать использование Dispose в C#, я понимаю, что он служит для того, чтобы удалить объекты, но не заканчиваюсь понимать, который является Вашим использованием, так как я думаю, что C# он располагает автоматическим пересборщиком мусора.

Edit: Я искал больше информации и он используется для не управляемых ресурсов, но каковы управляемые и не управляемые?

4
задан 14.09.2016, 15:51
3 ответа

У использования dispose большая утилита есть в случае не управляемых ресурсов, но каков различие между управляемым ресурсом и один не управляемое?

Управляемые ресурсы

Он относится ко всем типам внутри.NET, к которым garbage collector имеет доступ, и которых он берется за то, чтобы "управлять", управлять ресурсами, которые используют (использование cpu и памяти). Здесь включаются все классы Framework.NET.


Не управляемые ресурсы

Он относится к тем, которые существуют вне sandbox.NET, который включает любую вещь, которую он возвращен через призывы к АПИ'С Вин32, которые являются способом соглашаться на родных API´s операционной системы.


Но...

Если ты никогда не звонишь в функцию в API Win32 и никогда не получаешь никакого Win32 "handle" object, тогда ты не поддерживаешь никакого не управляемого ресурса, но Поля, Streams, связей на основе данных, и т.д., который ты открываешь через классы.NET framework, wrappers управляемые (свертки). Ты мог бы не поддерживать никакого не управляемого ресурса прямо, все же ты мог бы поддерживать косвенно через wrappers управляемые, именно поэтому управляемые wrappers осуществляют IDisposable.

Dispose и IDisposable

Они позволяют тебе возвращать тебя в прежнее состояние любого ресурса, который ты получил бы от операционной системы через.NET (не управляемые ресурсы), и освобождать от этой формы объекты, которые использовали бы ресурсы.

Он повелительный, что освободили ресурсы после использования любого не управляемого ресурса (использованный прямо или косвенно), по этой причине было бы общим видеть в.NET фрагменты такого кода как следующий.

try
{
  MemoryStream Mem = new MemoryStream();
  //Trabajamos con el y luego
}catch{}
finally{
  if(Mem!=null)Mem.Dispose();
}

Но чтобы предотвращать нас повторять этот код будучи так необходим освобождать ресурсы, не управляемые в.NET, с интерфейсом IDisposable мы можем использовать синтаксис using, что позволяет нам писать предыдущий фрагмент более элегантным образом.

using(MemoryStream mem = new MemoryStream())
{
   //Trabajamos con el y luego se llamara a dispose automaticamente
}

Помни что осуществи IDisposable в классах, которые ты построил, которые поддержали ссылки на не управляемые ресурсы или wrappers управляемые.

4
ответ дан 24.11.2019, 13:24
  • 1
    Дело в том, что я смотрю этот ejempo asp.net/web-api/overview/advanced/dependency-injection , но когда он называется в dispose public class ProductRepository: IDisposable? –  gvivetapl 14.09.2016, 17:15
  • 2
    Почти в конце концов он говорит " Веб API then calls GetService on the child scope to поверьте the controller. When request is завершил, Веб API calls Dispose on the child scope. Используйте the Dispose method to dispose of the controller†™ s dependencies. и quot; он относится, чему, когда product repository регистрирует с IoC контейнер, он берется за то, чтобы делать dispose из созданных объектов, когда request закончился. –  Jesus Angulo 14.09.2016, 17:25
  • 3
    он не под сомнением, хороший @JesusAngulo переглинистый песчаник и # 243; поздравление в StackOverflow в Espa и # 241; ol: D #LlamemosAtodosLosMsInfluencers! большой учитель Маурисио Соугаррет tambi и # 233; n пойди из-за этого очага: D –  fredyfx 14.09.2016, 20:55

Dispose используется для того, чтобы закрывать или освобождать правильно решения, которые создают субпроцессы в операционной системе, как например класс MemoryStream.

В настоящее время, используется решение using для того, чтобы использовать Dispose разъединенной формы, посредством интерфейса IDisposable. Пример:

 using (MemoryStream MEM = new MemoryStream()) 
 {
 }

Используясь, таким образом, объект одинокий MEM будет существовать внутри скобок ключа. Когда курсор выполнения выйдет из вышеупомянутых скобок, решение using возьмется за то, чтобы закрывать правильно ресурсы системы, использованной объектом MEM, и не только это, но также каждый объект, созданный внутри скобок ключей.

Я надеюсь, что он подает тебя.

2
ответ дан 24.11.2019, 13:24

mГ©todo Dispose осуществляется, чтобы освобождать не управляемые ресурсы, которые она aplicaciГіn он использует. Implementing в Диспосе Метод

IDisposable †“The oft misunderstood and misused интерфейс

using - очень хорошая практика, чтобы определять объекты, в которых ты нуждаешься, освободите Ваши ресурсы как только ты заканчиваешь trabjar с ними.

using гарантирует правильное разрушение объекта, так как он только будет стоиться внутри района, который это определяет.

использует достаточно using, чтобы определять объект связи ado.net

using(SqlConnection conn = new SqlConnection("conn string")){
   conn.Open();
   //resto del codigo
}
0
ответ дан 24.11.2019, 13:24

Теги

Похожие вопросы