Pergunta

Guids são criados usando o new Palavra -chave que me faz pensar que é um tipo de referência.

Isso está correto?

Guid uid = new Guid();

Os guids são armazenados na pilha?

Foi útil?

Solução

Você pode ver a definição de um GUID:

public struct Guid ...

Ou você pode testá -lo assim:

bool guidIsValueType = typeof(Guid).IsValueType;

Os GUIDs são criados usando a nova palavra -chave que me faz pensar que é um tipo de referência.

Estruturas também podem ter construtores, por exemplo new DateTime(2012, 12, 23).

Outras dicas

Guid é um tipo de valor.

Ver Msdn. Observe que Guid é um estrutura. Todas as estruturas são Tipos de valor.

Os GUIDs são criados usando a nova palavra -chave que me faz pensar que é um tipo de referência.

Pare de pensar isso. Tipos de valor também podem ter construtores. É perfeitamente legal, embora estranho, dizer

int x = new int();

É o mesmo que atribuir zero a x.

Isso está correto?

Não.

O GUID é armazenado no heap?

Sim. Os GUIDs também são armazenados na pilha.

Observe que a análise abaixo assume que a implementação da CLI é a Microsoft "Desktop" ou "Silverlight" CLR em execução no Windows. Não tenho idéia do que outras versões da CLI fazem, o que elas fazem nos Macs e assim por diante. Se você precisar saber se um pedaço de memória específico é armazenado na pilha em outras implementações, você terá que perguntar a alguém que é um especialista nessas implementações.

Um GUID é armazenado na pilha nas seguintes circunstâncias:

(1) Quando o GUID é um resultado "temporário" de um cálculo em andamento ou está sendo usado como um argumento para um método. Por exemplo, se você tiver um método, ligue para M (new GUID ()), o armazenamento temporário para o novo GUID será alocado na pilha.

(2) Quando o GUID é uma variável local que não está em um bloco de iterador, (b) não é uma variável externa fechada de um método anônimo ou expressão de lambda.

Em todas as outras situações, o GUID não é armazenado na pilha. Um GUID é armazenado na pilha quando é um campo de um tipo de referência, um elemento de uma matriz, um local fechado de um método anônimo ou expressão lambda ou um local em um bloco de iterador.

Um GUID também pode ser armazenado em nem o heap GC nem a pilha. Um GUID pode ser armazenado em memória totalmente não gerenciada, acessada por aritmética do ponteiro inseguro.

Estou curioso para saber por que você se importa tanto com se os pedaços de um GUID estão na pilha ou na pilha. Que diferença faz?

Na verdade Guid. Todos os tipos são construídos usando o new palavra -chave. Você pode identificar tipos de referência dos tipos de valor se eles são um classe, interface, ou delegar (todos os tipos de referência), ou um estrutura ou enum (tipos de valor).

Seu tipo de valor, veja o exemplo abaixo:

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
*/
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top