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