Гуид считают типом значения или ссылочным типом?

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

Это корректно?

Guid uid = new Guid();

Гуиды хранятся на "куче"?

30
задан Jon Seigel 27 February 2010 в 03:46
поделиться

5 ответов

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

public struct Guid ...

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

bool guidIsValueType = typeof(Guid).IsValueType;

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

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

36
ответ дан 27 November 2019 в 23:03
поделиться

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 может храниться в полностью неуправляемой памяти, доступ к которой осуществляется с помощью арифметики с небезопасным указателем.

Мне любопытно, почему вы так заботитесь о том, находятся ли биты руководства в стеке или в куче. Какая разница?

18
ответ дан 27 November 2019 в 23:03
поделиться

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

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

38
ответ дан 27 November 2019 в 23:03
поделиться
7
ответ дан 27 November 2019 в 23:03
поделиться

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

6
ответ дан 27 November 2019 в 23:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: