Является ли Guid признаком типа значения или ссылочного типа?

Гиды создаются с использованием ключевого слова new, что заставляет меня думать, что это ссылочный тип.

Правильно ли это?

Guid uid = new Guid();

Сохранены ли гиды в куче?

Ответ 1

Вы сами можете увидеть определение Guid:

public struct Guid ...

Или вы можете проверить это следующим образом:

bool guidIsValueType = typeof(Guid).IsValueType;

GUID создаются с использованием нового ключевое слово, которое заставляет меня думать, что это ссылочный тип.

Структуры также могут иметь конструкторы, например new DateTime(2012, 12, 23).

Ответ 2

Guid - это тип значения.

См. MSDN. Обратите внимание, что Guid является struct. Все структуры Типы значений.

Ответ 3

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 в стеке или в куче. Какая разница?

Ответ 5

На самом деле Guid. Все типы создаются с использованием ключевого слова new. Вы можете идентифицировать типы ссылок из типов значений, независимо от того, являются ли они class, интерфейс или делегат (все ссылочные типы) или struct или enum (типы значений).