GUID создаются с использованием нового ключевого слова, которое заставляет меня думать, что это ссылочный тип.
Хватит так думать. Типы значений также могут иметь конструкторы. Совершенно законно, хотя и странно, говорить
int x = new int();
Это то же самое, что присвоить ноль x.
Это правильно?
Неа.
GUID хранится в куче?
Да. Направляющие также хранятся в стеке.
Обратите внимание, что в приведенном ниже анализе предполагается, что реализация CLI - это "настольный компьютер" или CLR "Silverlight" от Microsoft, работающий в Windows. Я понятия не имею, что делают другие версии CLI, что они делают на Mac и так далее. Если вам нужно узнать, хранится ли определенный кусок памяти в стеке в других реализациях, вам нужно будет спросить кого-то, кто является экспертом в этих реализациях.
Guid хранится в стеке при следующих обстоятельствах:
(1) когда Guid является «временным» результатом текущих вычислений или используется в качестве аргумента для метода. Например, если у вас есть вызов метода M (new Guid ()), то временное хранилище для нового Guid выделяется в стеке.
(2) когда Guid является локальной переменной, которая (а) не находится в блоке итератора, (б) не является закрытой внешней переменной анонимного метода или лямбда-выражения.
Во всех других ситуациях Guid не сохраняется в стеке. Guid хранится в куче, когда это поле ссылочного типа, элемент массива, закрытый локальный элемент анонимного метода или лямбда-выражения или локальный элемент в блоке итератора.
Guid также может храниться ни в куче GC, ни в стеке. Guid может храниться в полностью неуправляемой памяти, доступ к которой осуществляется через небезопасную арифметику указателей.
Мне любопытно, почему вас так волнует, находятся ли биты направляющей в стеке или в куче. Какая разница?