|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Большое спасибо за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2014, 06:21 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Завёл два базовых класса - DisposableWithUnmanagedBase и DisposableWithoutUnmanagedBase. Во втором классе убрал метод DisposeUnmanagedResources, убрал финализатор и упростил DisposeManagedResources. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2014, 06:33 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Arm79HomeCoderА ещё какая-то практика есть, чтобы после Dispose или просто, когда объект уже не нужен, назначать объектам null - это что, быстрее и вернее заставит сборщика мусора на самом деле освободить ресурсы, или это маразм и перестраховка сиплюсплюсников? сборщик мусора он на то и сборщик, что работает сам. Стратегия работы сборщика может задаваться например в конфиге. Разумеется, можно вызвать и вручную GC.Collect, но это признак плохого тона. Если реальный вызов сборщика неопределён, то тогда есть смысл в присваивании null, как я думаю. Ибо часто встречаются конструкции вида Код: c# 1. 2. 3. 4.
Вот после вызова Dispose есть смысл поставить obj = null. Потому что сразу после вызова Dispose сборщик может и не вызваться, зато может быть: 1) снова будет вызван код выше; 2) кто-то другой попытается вызвать объект obj. И если в 1) спасает правильный шаблон Dispose, который должен быть спроектироват так, чтобы было безопасно вызывать Dispose много раз подряд, то в 2) что спасёт? Может же быть такая ситуация, что сборщик ещё только начал удалять obj (т. е. obj ещё не null), а кто-то пытается его использовать? Я правильно рассуждаю? Или объясните уже наконец, ПОЧЕМУ многие присваивают null объектам? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2014, 09:41 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
HomeCoderИли объясните уже наконец, ПОЧЕМУ многие присваивают null объектам? А особенно объектам, которые реализуют Dispose. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2014, 09:46 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
HomeCoderИ если в 1) спасает правильный шаблон Dispose, который должен быть спроектироват так, чтобы было безопасно вызывать Dispose много раз подряд, то в 2) что спасёт? Может же быть такая ситуация, что сборщик ещё только начал удалять obj (т. е. obj ещё не null), а кто-то пытается его использовать? Я правильно рассуждаю? Или объясните уже наконец, ПОЧЕМУ многие присваивают null объектам? 1) Null присваивают по разным причинам, и эти причины не всегда связаны с Dispose. Я вот отнюдь не всегда пишу null. Например, var obj = new КакаяТоДиспозейблХрень(); try { чего нить } finally { obj.Dispose() } Никакого присвоения null нет, obj далее не используется, когда его приберет сборщик мусора - мне неизвестно и совершенно неинтересно. 2) Если у вас несколько разных объектов пытаются вызывать Dispose у одного объекта, это неправильная архитектура (ИМХО). Всегда должно быть точно определено, кто создает объекты, и кто их уничтожает. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2014, 10:00 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Ну а если такая ситуация, что объекты используются часто, и где-то вызвался Dispose. Если сборщик сразу не освобождает память, то может быть попытка использования объекта, для которого уже вызван Dispose. К чему это может привести? Вот эта неопределённость мне и не нравится. В С++ ты сделал delete объекта по указателю, присвоил указателю null и всё это произошло сразу - нет никаких недомолвок, что де сборщик какой-то не сразу всё удалил или удалил лишь частично. Меня просто нервирует это. Сначала декларируется, что не надо думать об освобождении памяти. Потом вводится понятие Dispose (и это без всяких unsafe - с unsafe всё ещё усложняется). А потом говорится, что даже после всех этих Dispose и ручного вызова GC.Collect не обязательно сразу ресурсы будут освобождены. Сборщик мусора ещё подумает. Вводится понятие поколений объектов в мусорной куче (хорошее название для "кучи", хе-хе). Потом говорится, что и правилу поколений сборщик не всегда следует - есть де случаи, когда и объекты, которые уже должны быть удалены, всё ещё живут. И вот при такой неопределённости предлагается писать приложения. При такой неопределённости простое присвоение null выглядит простым и эффективным способом избавиться от этих костылей. У нас же уже есть шаблон if (obj != null). Для таких общепринятых проверок простое присвоение null может быть хорошей практикой и гарантией, что не будет использования объекта, для которого уже был вызван Dispose, но который ещё фактически не освободился. Или освободился не полностью. Я думаю, тут загвоздка вот в чём. Нужно разделять управление памятью (предотващение утечек и пр.) и логику использования объектов в коде. GC занимается управлением памятью - т. е. предотвращает утечки и снимает с программиста работу по ручному освобождению ресурсов. Но он не защищает от использования объектов, которые по логике уже освобождены, а по факту - нет. От этого защищает присвоение null. Когда говорят, что присваивать null не нужно, имеют ввиду, что это не нужно делать для освобождения ресурсов . Но не для защиты от использования объектов, которые по логике (только по логике, но ещё не на самом деле) уже освобождены. Сборщик мусора может сработать сильно позже и "занулить", объект, а использование объекта может быть раньше этого "зануления". Поэтому, чтобы такого неправильного использования не произошло, надо присваивать null объекту, который больше не предпоплагается использовать. Это не освобождает ресурсы, а всего лишь сигнализирует программисту о том, что этот объект СЧИТАЕТСЯ ОСВОБОЖДЁННЫМ. Как вы считаете? Просто уже нервирует, когда видишь проект, в котором в порядке вещей куча подобных вот Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 07:45 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
HomeCoderЕсли сборщик сразу не освобождает память, то может быть попытка использования объекта, для которого уже вызван Dispose 1) В том шаблоне, который я приводил, есть свойство IsDisposed. Поэтому смело можно вызывать хоть 10 Dispose подряд. Исполнится только первый. Проверка на null нужна только чтобы убедиться, что объект существует. К ресурсам, которые этот объект использует, null никак не относится. 2) Вы не понимаете концепции управляемой памяти. Dispose нужен для скорейшего освобождения ресурсов. Например, соединения с БД, или файла. Но не для удаления объекта. Сами объекты можно не удалять вообще - это работа GC. Я бы даже сказал, что это предпочтительный стиль кодирования - куча мелких (и желательно immutable) объектов. В этом случае GC работает очень эффективно. И отказываться от такого стиля нужно только в случае особых обстоятельств, например, проседания по производительности 3) Код пишите вы, вот и обеспечивайте ситуацию, когда таких попыток не будет. У меня же получается. Не вижу причин, чтобы это не получалось у вас. Почему у вас по коду должно быть разбросано много мест, где делают Dispose? Делайте в одном месте. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 10:05 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Arm79, я имел ввиду, что Dispose вызван, а объект продолжает кто-то вызывать. Не Dispose на объекте, а сам объект использовать - его методы, свойства и прочее. Т. е. ресурсы, которые использует этот объект, освобождены, а объект пытаются использовать с этими ресурсами. - Ошибка. А если "занулить" объект, то и использовать нечего. - Хорошо. А? Может, стоить где-то в этот шаблон Dispose добавить зануление этого объекта? Типа this = null? Или что-то в этом роде. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 11:11 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
А, уже есть аналог - вместо null и проверки if(obj != null) надо использовать IsDisposed и проверку if(obj.IsDisposed) Правильно? Только вот загвоздка - все знают шаблон проверки if(obj != null), а вот шбалон проверки if(obj.IsDisposed) не распространён. Надо запоминать, договариваться с коллегами, вводить правила, что для унаследованных от такого-то класса надо такие-то проверки делать. Потом в коде проверять, унаследован ли или нет... С null как-то более привычно и распространённо. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 11:14 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
если HomeCoderDispose вызван, а объект продолжает кто-то вызывать, то это косяк архитектуры. И null здесь никак не поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 11:29 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Arm79если HomeCoderDispose вызван, а объект продолжает кто-то вызывать, то это косяк архитектуры. И null здесь никак не поможет. как и при обращении по висячей ссылке после удаления объекта в c++ ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 11:41 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
HomeCoder, Dispose никакого отношения к уборке мусора не имеет, ну разве что запрет на вызов финализатора в классическом исполнении Все ваши сепаратистские высказывания в стиле обращение к отдиспозеному объекту сводятся к простому - обращение к объекту состояние которого программист изменил по незнанке и где реальный результат отличается от ожидаемого. типа cm.CommandText=""; ну что тут ответить......... наверно имя - насрано... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 12:04 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Тогда как вы можете прокомментировать постоынне заналливания после Dispose в примере кода , что я привёл? Там автор писал, что он недостаточно опытен в С#. Более того, код был портирован с С++, где автор кода был более опытен. Можно это посчитать за старую привычку сиплюсплюсника? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 20:40 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
HomeCoder, от очистки ссылок польза есть - если по каким либо причинам объект, метод shutdown которого демострируется в примере, не удалится мусоросборщиком (ссылку кто либо удержит) - хвосты освободятся ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 21:35 |
|
|
start [/forum/topic.php?fid=20&msg=38689105&tid=1402719]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 134ms |
0 / 0 |