|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
Всем привет. Вопрос начинающего. Верно ли реализован метод Dispose в этом классе ? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Пример использования Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2017, 14:25 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
Новичок ООП..Всем привет. Вопрос начинающего. Верно ли реализован метод Dispose в этом классе ? https://msdn.microsoft.com/ru-ru/library/b1yfkh5e(v=vs.110).aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2017, 14:34 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
Новичок ООП.., drs_connection может быть null! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2017, 14:36 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
ЕвгенийВ, нужно как-то так сделать ? Код: c# 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2017, 14:42 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
Roman Mejtes, ссылку читал - там очень корявым языком написано, ничего не понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2017, 14:43 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
вообще держать открытым подключение не имеет смысла, лучше открывать его и закрывать по необходимости через и высвобождать через using. я кинул вам на бест практикс шаблон создаете закрытый метод Dispose(true), и вызываете его с параметром true из метода который имплиментирует интерфейс, а после вызова помечаете его в сборщике как высвобожденный методом GC.SuppressFinalize(this); после чего сборщик не будет запускать Dispose для данного объекта, + добавить в финализатор вызов Dispose(false). При вызове Dispose(false) нужно исключить все возможные исключения при выполнении, а так сделать выполнение максимально быстрым, без задержок. Почему так? Причина кроется в том, что финализатор вызывается сборщиком мусора, во время очистки памяти, на очистку памяти выделяется определенный период времени, если он будет превышен очистка прервётся, при этом вся программа просто зависнет и не будет отвечать на запросы пользователя, а если упадет с исключением (Exception) то ваша программа просто упадет. Примеры как надо, в ссылке выше. Предположим, что в момент вызова сборщиком мусора финализатора у вас пропадет сеть, а в диспосе идет какой то сетевой запрос или обращение к какому то сетевому ресурсы, всё может зависнуть секунд на несколько секунд. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2017, 15:04 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
нинзя фикс, после SuppressFinalize сборщик не будет запускать финализатор объекта, а не Dispose, а вот уже из финализатора вы дерните Dispose(false). По сути, в методе bool disposing говорит о том, что финализатор запущен вызван вам из кода, а false, его вызвал сборщик мусора через деструктор ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2017, 15:07 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
Roman Mejtesдержать открытым подключение не имеет смысла, лучше открывать его и закрывать по необходимости через и высвобождать через usingа это замечание к чему? весь смысл моего кода как раз и заключается в том, чтобы немедленно закрыть connection после того, как отработает DataReader и я как раз использую using для этого - собсно с этого самого using всё и началось - так я узнал, что нужно реализовать интерфейс IDisposable и так я до сих пор не понял, зачем я должен реализовывать перегруженный метод Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2017, 15:27 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
Новичок ООП.., я же уже написал вам, чтоб выгружать неуправляемые ресурсы безопасно. Чтоб исключить зависания, падения во время работы сборщика мусора. В финализаторе добавляют Dispose(false), что высвободить те ресуры, которые (возможно) забыл высвободить программист, но если он не забыл, то финализатор (деконструтор) вообще не будет вызываться, так как вы уже вызвали SupressFinalize. Всё эту схему с ~, Dispose, Dispose(true) делают именно для таких случаев. А как реазовывать это ваша личное дело. Вы спросили как лучше, я вам написал, что признанным шаблоном в C# является такой способ. вы либо делайте по шаблону как все, либо делайте свой код и не кто не говорит, что он может получиться хуже. Просто представьте садитсья другой программист работать с вашим кодом, если вы всё делайте по шаблону который ему должен быть знаком, ему будет значительно прще разобраться и найти проблему в вашем коде, а так же от куда оно проистекает. Из сборщика мусора или где то в коде. Тем более, что ошибка из сборщика мусора может возникнуть в совершенно неожиданный момент и локализовать её может быть очень сложно, если у вас программа не работает в режиме отладки. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2017, 15:50 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
Roman Mejtesя же уже написал вам, чтоб выгружать неуправляемые ресурсы безопасно.вы же видите, что мой класс не содержит никаких неуправляемых ресурсов. Тогда к чему это замечание, всё никак не пойму. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2017, 15:56 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
Новичок ООП..весь смысл моего кода как раз и заключается в том, чтобы немедленно закрыть connection после того, как отработает DataReader Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2017, 17:12 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
Новичок ООП..Тогда к чему это замечание, всё никак не пойму. к чему к чему, видимо на пути к знаниям, полезно знать зачем так делается. а по сути, для возможности расширения твоего класса, в который могут добавиться неуправялемые ресурсы. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2017, 18:34 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
спасибо всем участникам дискуссии, пишите ещё. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2017, 09:29 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
hVosttдля возможности расширения твоего класса, в который могут добавиться неуправляемые ресурсыне могли бы вы привести пример, когда возникает необходимость добавления неуправляемых ресурсов (и пример самих таких ресурсов) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2017, 09:31 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
Новичок ООП..не могли бы вы привести пример, когда возникает необходимость добавления неуправляемых ресурсов (и пример самих таких ресурсов) Например, требуется заменить провайдер на какой-нибудь экзотический, подключаемый через [DllImport], и освобождать ресурсы вручную. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2017, 09:48 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
Arm79, Достаточно только Код: c# 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2017, 10:51 |
|
Как правильно реализовать интерфейс IDisposable
|
|||
---|---|---|---|
#18+
Новичок ООП..ЕвгенийВ, нужно как-то так сделать ? Код: c# 1. 2. 3.
Достаточно Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2017, 10:54 |
|
|
start [/forum/topic.php?fid=20&fpage=46&tid=1399967]: |
0ms |
get settings: |
19ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 329ms |
total: | 480ms |
0 / 0 |