Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Общие вопросы по .NET и C# > как с# работает с памятью? |
Автор: CompWorm 20.4.2013, 21:59 |
Привет всем! сразу скажу, я больше знаком с С++, чем с С#, потому такой вопрос задаю, возможно странный ![]() в общем хочу реализовать на шарпе паттерн "адаптер" - это класс с указателями, в конструктор которого передаётся некий объект, далее этот объект потрошится, и его части привязываются к указателям адаптера. Далее к этому объекту я буду обращаться через адаптер. проблема в том, что, как я понял, в Шарпе указатели почти не используются, они находятся в ветке unsafe и вмечто них компилятор как-то сам разруливает что считать указателем, а что объектом... типа все переменные считаются ссылками(?) может кто-нибудь показать на этом примере, как управляться с памятью? |
Автор: SKrivosein 21.4.2013, 04:08 | ||
CompWorm в .NET работа на прямую с памятью (и указатели) используются редко, только в специальных случаях. И паттерна "адаптер" не касаются. Этот патерн можно сделать с помощью наследования, интерфейсов или делегатов. В том случае который ты описал (при недостатке инфы ![]() Я попробовал накидать такой псевдокод с делегатами. Мож чего не так, так уточняй задачу...
|
Автор: CompWorm 25.4.2013, 03:42 | ||||
короче, я похоже разобрался в общих чертах. в шарпе классы дают ссылочный тип, а структуры нессылочный. то есть
тут aaa - это то что в с++ зовётся смарт-поинтер. он пока нулевой и к члену ddd обратиться нельзя. его надо будет чем-то проинициализировать. bbb это уже готовый объект, сразу можно позвать bbb.ddd. соответственно при вызове такой функции
в _aaa будет скопирован адрес, на который ссылается aaa, а в _bbb будет скопирована bbb целеком. а чтобы bbb не копировалась, а передалась по ссылке надо использовать ref или out. когда все ссылки на объект ссылочного типа померли, гарбидж-коллектор уничтожит эти объекты (в с++ это я бы назвал утечкой памяти ![]() по моим экспериментам, если вручную не вызвано GC.Clear(); то очистка произойдёт не раньше чем, через минуту. |
Автор: SKrivosein 26.4.2013, 20:44 | ||||
Это с непривычки ![]()
Но есть там всякие особенности, финализация, освобождение неуправляемых ресурсов, использование инструкции using. Хотя в общем-целом бояться за управляемую память, которая под контролем CLR, не надо. Она за собой заметет. |