2008-10-29 5 views
1

Quand la mémoire est-elle allouée dans le framework .NET compact? S'il y a une différence entre la valeur et les types de référence, veuillez détailler. La documentation ou les étapes à confirmer sont appréciées.Quand la mémoire est-elle allouée dans le framework .NET compact?

En particulier, considérez ce scénario ...

private MyClass item; // here? 

public void MyMethod() 
{ 
    item = new MyClass(); // or here? 
} 

Répondre

5

Il y a 3 façons différentes de mémoire allouée.

statique:

Ceux-ci sont liés et alloués au moment de la compilation. Variables statiques globales par exemple.

Stack dynamique:

Ceux-ci sont liés lors de l'exécution et poussé sur la pile. Telle une variable locale dans un appel de fonction.

Tas dynamique:

Maintenant dynamique tas a aussi quelques différentes catégories « sous », comme implicite et explicite, mais je ne vais pas entrer dans ce détail.

Lorsque vous déclarez

private MyClass item; // here? 

une référence à MyClass est poussé sur la pile. Ce n'est qu'une référence et rien de plus. Sa valeur est nulle à ce moment-là.

public void MyMethod() 
{ 
    item = new MyClass(); // or here? 
} 

Il est à ce moment-là où la mémoire est explicitement attribué sur le tas en appelant « new MyClass() » et point alors des références il.

Donc, en réalité, vous avez 2 variables après avoir appelé MyMethod. Un élément de type refernce nommé, et une variable non nommée sur le segment de mémoire dont les références d'articles sont de type MyClass.

1

C'est une question piège, ce qui me plaît beaucoup plus que je ne le pensais. :)

Commençons par les bases:

Déclarant une variable n'alloue pas directement à la mémoire * pour cela sur les types de référence. Il fait le faire sur les types de valeur, parce que les types de valeur sont initialisés au point de déclaration. Pour les types de référence, le stockage de l'objet est attribué au moment de l'entrée de leurs constructeurs.

* Quand cela ne s'applique-t-il pas?

  • Sur la première utilisation d'une classe donnée (qui pourrait bien être votre première ligne), toutes les données statiques niveau de classe est initialisé, et si la classe a un constructeur statique (qui attribue sans doute la mémoire), il être appelé aussi bien. Par conséquent, vous pouvez réellement allouer de la mémoire (pour les membres statiques) à une déclaration de variable.
  • Techniquement, en déclarant votre variable de type référence , alloue-t-il de la mémoire sur la pile (comme l'a mentionné Nicholas Mancuso) - la mémoire allouée est le stockage de niveau pile pour la référence à l'objet.(Il est vrai que, ladite référence est null, mais une fois que vous initialisez votre objet, une référence valable existera dans la mémoire allouée.)

Je recommande fortement ce C-Sharp Corner article en ce qui concerne la pile et l'allocation des tas pour plus d'informations.

+0

Très belle réponse, ajoute quelques petites choses laissées par Nicholas. Je vais voter, mais il obtient les points de réponse. Merci! –

+0

Et il devrait; sa réponse était plus complète. :) Lui et moi avons répondu presque au même moment, au large d'une minute ou deux. :) –

0

Je vous recommande fortement de consulter MSDN Webcase au Compact Framework Memory Management. Ce n'est pas exactement la même chose que sur le bureau, et cette présentation couvre tout un tas de détails et de graphiques pour aider à comprendre le GC Heap.

+0

Le lien est

+0

Mais l'événement est terminé et je ne trouve pas de téléchargement de la vidéo ou de la présentation. –

+0

Enregistrez-vous et il vous donnera un lien de téléchargement. Ce n'est pas très intuitif. – ctacke

Questions connexes