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