Считается ли Guid типом значения или ссылочным типом? - PullRequest
30 голосов
/ 26 февраля 2010

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

Это правильно?

Guid uid = new Guid();

Хранятся ли гиды в куче?

Ответы [ 6 ]

37 голосов
/ 26 февраля 2010

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

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

36 голосов
/ 26 февраля 2010

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

public struct Guid ...

Или вы можете проверить это так:

bool guidIsValueType = typeof(Guid).IsValueType;

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

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

17 голосов
/ 26 февраля 2010

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

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

7 голосов
/ 26 февраля 2010
6 голосов
/ 26 февраля 2010

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

1 голос
/ 03 апреля 2018

Тип значения, см. Пример ниже:

using System;                   
public class Program
{
    public static void Main()
    {
        Guid a1 = new Guid();
        Console.WriteLine(a1);
        Guid b1 = a1;
        Console.WriteLine(b1);
        a1 = Guid.NewGuid();
        Console.WriteLine(a1);
        Console.WriteLine(b1);
    }
}

/* OUTPUT
00000000-0000-0000-0000-000000000000
00000000-0000-0000-0000-000000000000
164f599e-d42d-4d97-b390-387e8a80a328
00000000-0000-0000-0000-000000000000
*/
...