Когда в компактной платформе .NET выделяется память?

Когда в компактной платформе .NET выделяется память? Если есть разница между типом значения и ссылочным типом, укажите подробности. Приветствуются документация или шаги для подтверждения.

В частности, рассмотрите этот сценарий ...

private MyClass item;  // here?

public void MyMethod()
{
    item = new MyClass();  // or here?
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
962
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Есть 3 различных способа распределения памяти.

Статический:

Они привязываются и выделяются во время компиляции. Например, глобальные статические переменные.

Стек динамический:

Они связываются во время выполнения и помещаются в стек. Например, локальная переменная в вызове функции.

Динамическая куча:

Теперь у динамической кучи также есть несколько разных «подкатегорий», таких как неявные и явные, но я не буду вдаваться в эти подробности.

Когда вы заявляете

private MyClass item;  // here?

ссылка на MyClass помещается в стек. Это всего лишь справка и не более того. В этот момент его значение равно нулю.

public void MyMethod()
{
    item = new MyClass();  // or here?
}

Именно в этот момент память явно выделяется в куче путем вызова 'new MyClass ()', а затем элемент ссылается на него.

Итак, на самом деле у вас есть две переменные после вызова MyMethod. Тип ссылки с именем item и безымянная переменная в куче, элемент которой ссылается на тип MyClass.

Это что-то вроде вопроса с подвохом, и он мне нравится намного больше, чем я думал. :)

Начнем с основ:

Объявление переменной напрямую не выделяет для нее память * для ссылочных типов. делает делает это с типами значений, потому что типы значений инициализируются в точке объявления. Для ссылочных типов хранилище для объекта выделяется в момент ввода их конструкторов.

* Когда это не применяется?

  • При первом использовании данного класса (который вполне может быть вашей первой строкой) инициализируются любые статические данные уровня класса, и если у класса есть статический конструктор (который предположительно выделяет память), он также будет вызван. Следовательно, вы можете выделить некоторую память (для статических членов) при объявлении переменной.
  • Технически, объявляя переменную ссылочного типа, делает выделяет некоторую память в стеке (как упомянул Николас Манкузо) - выделенная память является хранилищем на уровне стека для ссылки на объект. (По общему признанию, указанная ссылка - null, но как только вы инициализируете свой объект, действительная ссылка будет существовать в выделенной памяти.)

Я настоятельно рекомендую этот Статья C-Sharp Corner относительно распределения стека и кучи для получения дополнительной информации.

Очень хороший ответ, добавляет несколько вещей, которые намекнул Николас. Я проголосую за, но он получает баллы за ответы. Спасибо!

Anthony Mastrean 30.10.2008 15:33

И он должен; его ответ был более обстоятельным. :) Мы с ним ответили почти одновременно, примерно через минуту. :)

John Rudy 30.10.2008 16:13

Я настоятельно рекомендую вам посмотреть веб-кейс MSDN на Управление памятью Compact Framework. Это не совсем то же самое, что и на настольном компьютере, и в этом докладе он рассматривается с большим количеством деталей и графиков, чтобы помочь в понимании GC Heap.

Ссылка: <msevents.microsoft.com/cui/…>

Anthony Mastrean 13.01.2009 00:29

Но мероприятие закончилось, и я не могу найти загрузку видео или презентации.

Anthony Mastrean 13.01.2009 00:31

Просто зарегистрируйтесь, и вы получите ссылку для скачивания. Это не очень интуитивно понятно.

ctacke 14.01.2009 03:34

Другие вопросы по теме