Question

Guids sont créés à l'aide du mot-clé new qui me fait penser qu'il est un type de référence.

Est-ce correct?

Guid uid = new Guid();

sont-Guids stockés sur le tas?

Était-ce utile?

La solution

Vous pouvez voir la définition d'un Guid vous:

public struct Guid ...

Ou vous pouvez le tester comme ceci:

bool guidIsValueType = typeof(Guid).IsValueType;
  

GUID sont créés à l'aide de la nouvelle   mot-clé qui me fait penser qu'il est un   Type de référence.

Structs peut avoir des constructeurs aussi, par exemple new DateTime(2012, 12, 23).

Autres conseils

Guid est un type de valeur.

Voir MSDN . Notez que Guid est un struct. Tous les struct sont Types de valeur .

  

GUID sont créés en utilisant le nouveau mot clé qui me fait penser qu'il est un type de référence.

Arrêtez de penser que. Les types de valeur peuvent avoir des constructeurs aussi. Il est parfaitement légal, si étrange, dire

int x = new int();

C'est le même que l'attribution de zéro à x.

  

Est-ce exact?

Non.

  

sont GUID est stocké sur tas?

Oui. GUID sont également stockés sur la pile.

Notez que l'analyse ci-dessous suppose que la mise en œuvre de la CLI est le « bureau » Microsoft ou « Silverlight » en cours d'exécution CLR sous Windows. Je ne sais pas ce que les autres versions de la CLI font, ce qu'ils font sur Mac, et ainsi de suite. Si vous avez besoin de savoir si un gros morceau particulier de la mémoire est stockée sur la pile dans d'autres implémentations, vous devrez demander à quelqu'un qui est un expert sur ces implémentations.

GUID est stocké sur la pile dans les cas suivants:

(1) lorsque le GUID est un résultat « temporaire » d'un calcul en cours ou est utilisée comme argument pour un procédé. Par exemple, si vous avez un appel de méthode M (nouveau Guid ()) puis le stockage temporaire pour le nouveau Guid est alloué sur la pile.

(2) lorsque le GUID est une variable locale qui est (a) pas dans un bloc itérateur, (b) un pas fermé sur la variable externe d'une méthode anonyme ou l'expression lambda.

Dans toutes les autres situations, le Guid ne sont pas stockées sur la pile. Un GUID est stocké sur le tas quand il est un champ d'un type de référence, un élément d'un tableau, une fermeture-over local d'une méthode anonyme ou expression lambda, ou un local dans un bloc itérateur.

Un Guid peut également être stocké dans ni le tas GC, ni la pile. Un GUID peut être stocké dans la mémoire non géré entièrement, accessible via un pointeur arithmétique dangereux.

Je suis curieux de savoir pourquoi vous vous souciez tant de savoir si les bits d'un guid sont sur la pile ou sur le tas. Quelle différence cela fait-il?

Il est en fait Guid . Tous les types sont construits en utilisant le mot-clé new. Vous pouvez identifier les types de référence de types de valeur par le fait que ils sont un , Interface ou délégué (tous les types de référence), ou struct ou ENUM (types de valeurs).

Son type de valeur, Voir l'exemple ci-dessous:

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
*/
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top