Управление памятью - проклятие Сишарпа

user7320
Дата: 12.06.2014 06:10:59
Абстракции текут как не знаю что...

1. Рекомендуют реализовывать IDisposable для всех классов-потомков, унаследованных от классов, реализующих IDisposable. А также, если класс содержит поля с типами, реализующими IDisposable. У меня, конечно, мало опыта, но что-то мне подсказывает, что для более-менее сложной системы это будут чуть менее, чем все классы. Да?

2. Реализая освобождения ресурсов сложнее и гораздо сложнее, чем в том же С++, который, якобы, в плане управления памятью сложнее, чем С#. Ведь в C# надо реализовать Dispose и финализаторы-деструкторы со сложными правилами и порядком их вызова, а в С++ - только деструкторы и без всякой возни с Dispose(bool) и кучей правил, типа "X DO NOT make the parameterless Dispose method virtual.". Ребята, так получается, что в С++ с памятью работать проще, если программа выходит за рамки своей "Hello World"-песочницы (что происходит почти всегда в нормальных приложениях) и начинает работать как взрослая, потребляя неуправляемые ресурсы и работая с другими приложениями?

3. Сборщик мусора сам заботится об освобождении ресурсов, но вдруг и внезапно это стало "bad coding style". Правильные пацаны всё делают руками и бьют по рукам тех, кто доверяет сборщику мусора. Поэтому у правильных пацанов в конторах все ресурсы освобождаются руками и код пестрит вызовами Dispose и using.


Я не понимаю - кто-нибудь, объясните мне - в чём тогда заключается плюс сборщика мусора, если в любой более-менее сложной программе надо памятью управлять самому? Сборщик мусора может управлять только самыми базовыми объектами, что даёт минимальные преимущества. И эти преимущества с лихвой покрываются сложностью и количеством правил "правильного" управления неуправляемыми ресурсами в C#.


Жду ваших рассуждений по этому поводу. Например, "да, так и есть - нас наипали, возвращаемся все на С++".
user7320
Дата: 12.06.2014 06:11:57
user7320
правил "правильного" управления неуправляемыми

4 однокоренных слова подряд - это вам не хухры-мухры.
user7320
Дата: 12.06.2014 06:32:00
А ещё мне нравится, как всякие эрики липперты говорят, типа, то-то и то-то - это "нарушение контракта, и тогда мы ни за что не отвечаем". При этом сами они контракты типа ".NET - платформа с автоматическим управлением памятью" нарушают на каждом шагу. Я понимаю, что надо отличать маркетинговую лабуду "всем срочно бежать на нашу новую платформу программирования" от того, что написано мелким шрифтом ("по правде говоря, наша новая платформа - говно... в ней плюс только - это реализация кучи готовых классов на все случаи жизни, а с управлением памятью вы ещё попортите себе нервы побольше, чем на С++ - ведь мало того, что оно сложнее, чем на С++, так ещё её реализация и скрыта от вас по большей части за недоступным для вас сборщиком мусора")... Но на самом деле я не хочу это понимать. Так и хочется ответить в духе

Картинка с другого сайта.
user7320
Дата: 12.06.2014 06:41:13
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=809186&msg=9843540
Да если и не использовать конструкцию using или Dispose() все равно ресурсы гарантировано освободятся, ибо в типовой реализации есть защита от идиота.
А как использовать ваш тип, решайте сами, или придерживаться типового паттерна, или изобрести
самому, но во втором случае мату будет предостаточно в ваш адрес, хотя я и подозреваю и в первом так же, ибо вам лень заглянуть, туда, куда программисты постоянно заглядывают..

Хе-хе... А если использовать паттерн неправильно (то бишь "изобрести свой"), то "защита от идиота" и в этом случае гарантирует освобождение ресурсов?

Т. е., если я буду хаотично вызывать всякие Dispose и SupressFinalize, а потом продолжу работу, вполне может быть, что память просто не освободится? Или как?
user7320
Дата: 12.06.2014 06:41:46
"Защита от идиота" - это тоже абстракция. А в C# абстракции протекают больше всех.
Изопропил
Дата: 12.06.2014 08:38:30
user7320
И эти преимущества с лихвой покрываются сложностью и количеством правил "правильного" управления неуправляемыми ресурсами в C#.

ничего сложного нет, если понимать механизмы
user7320
Дата: 12.06.2014 10:47:13
Изопропил
user7320
И эти преимущества с лихвой покрываются сложностью и количеством правил "правильного" управления неуправляемыми ресурсами в C#.

ничего сложного нет, если понимать механизмы

И с С++ не стоит переходить на всякие джавы и сишарпы, если у тебя 20 лет опыта в нём и тулзы с либками на все случаи жизни сделаны и отточены.
D129
Дата: 12.06.2014 11:21:35
user7320
1. Рекомендуют реализовывать IDisposable для всех классов-потомков, унаследованных от классов, реализующих IDisposable. А также, если класс содержит поля с типами, реализующими IDisposable. У меня, конечно, мало опыта, но что-то мне подсказывает, что для более-менее сложной системы это будут чуть менее, чем все классы. Да?


Нет.
У меня опыт около 10 разных проэктов (и больших, и маленьких).
Я ни разу не реализовывал этот самый IDisposable, но стирать - ненужное его использование (написанное выпускниками) - стирал.

Есть ряд прикладых проэктов, в которых не пишутся модули, которые будут отдаваться для использования еще кем-то. И поэтому, не составляет труда закрыть за собой сокет или освободить файл - тогда, когда надо, а не из расчета, что кто-то обязательно обернет в using , и будет ожидать правильного поведения.
Ну просто никогда не будет этого.
D129
Дата: 12.06.2014 11:36:57
user7320
2. Реализая освобождения ресурсов сложнее и гораздо сложнее, чем в том же С++, который, якобы, в плане управления памятью сложнее, чем С#. Ведь в C# надо реализовать Dispose и финализаторы-деструкторы


Правильнее было бы использовать не слово "надо" - потому, что обычно (95% кода и задач) - не надо.
А фразу "можно если нужно"
:-)

ЗЫ - Ни разу не писал финализатора (в реальном проэкте). Тем более, что в тех же книжках пишут что он иногда не вызвается....
:-)
D129
Дата: 12.06.2014 11:40:28
user7320

3. Сборщик мусора сам заботится об освобождении ресурсов, но вдруг и внезапно это стало "bad coding style". Правильные пацаны всё делают руками и бьют по рукам тех, кто доверяет сборщику мусора. Поэтому у правильных пацанов в конторах все ресурсы освобождаются руками и код пестрит вызовами Dispose и using.


Dispose и using - вовсе не освобождают ресурсы, по крайней мере они с вызовом Сборщика ни как не связаны - они сами по себе, он сам по себе.

Вызывать Dispose для класса, который не имеет внешних ресурсов (файлов, сокетов, постронних нативных длл) - это не смертельно, но не имеет никакого практического смысла.