Хорошие ответы. Я бы добавил, что Java зависит от использования ячеек памяти стека или кучи. С# тоже. Идея использования необработанных указателей является дополнением к C#, которое исходит из его кода C. Хотя C# и C/C++ не являются одним и тем же языком программирования, они имеют некоторые общие черты семантики. Идея использования «небезопасного» кода позволяет избежать хранения больших объектов в куче, где память ограничена примерно 2 ГБ на экземпляр среды выполнения (для C# на CLR, для Java на экземпляр JVM) без резкого снижения производительности из-за сборки мусора. В некоторых случаях вы можете использовать способность C# использовать небезопасные или управляемые вручную указатели памяти, чтобы обойти тот факт, что существует не так много сторонних инструментов для решения таких проблем, как кэширование вне кучи.
Я хотел бы предупредить, что если вы используете небезопасный код, обязательно ознакомьтесь с «Одноразовыми типами» и «Финализаторами». Это может быть довольно продвинутой практикой, и последствия неправильного удаления ваших объектов такие же, как и с кодом C... ужасная УТЕЧКА ПАМЯТИ. Последствия: у вас закончилась память для вашего приложения, и оно падает (нехорошо). Вот почему С# не разрешает это по умолчанию и что вам необходимо переопределить любое использование управляемых вручную указателей с помощью ключевого слова «небезопасно». Это гарантирует, что любая память, обрабатываемая вручную, является преднамеренной. Наденьте шляпу C-кода, когда имеете дело с ключевым словом «небезопасно».
Отличная ссылка на это была в главе «Понимание времени жизни объекта» в «Pro C# 2010 и платформа .Net» Эндрю Троелсена. Если вы предпочитаете ссылки в Интернете, см. веб-сайт MSDN Реализация Finalize и Dispose для очистки неуправляемых ресурсов
Последнее замечание: неуправляемая память освобождается в финализаторе вашего объекта (~ObjectName(){...}). Эти шаблоны увеличивают производительность, поэтому, если вы имеете дело со сценариями с более низкой задержкой, вам может быть лучше, если объекты будут легкими. Если вы имеете дело с человеческой реакцией, вы должны учитывать это там, где это абсолютно необходимо.
person
Zack Jannsen
schedule
20.03.2012