Je ferai tout ce que je veux savoir.C# langue:
vous Citant:
comme nous le savons types de référence sont toujours stockés sur les types de tas et valeur sont dans la mémoire de la pile.
TL; DR; Ce n'est pas vrai. S'il vous plaît lire les détails que j'ai posté ci-dessous. Dans votre cas, l'instance d'objet de la classe A
et la variable membre myInt
seront stockées sur le tas indépendamment du fait que myInt
est un type de valeur.
Pour résumer la façon dont les variables sont stockées sur tas et de la pile::
La pile est toujours utilisé pour stocker les deux choses suivantes:
- La partie de référence des variables locales référence typée dans les fonctions et leurs paramètres.
- type de valeur des variables locales et les paramètres de la méthode (de struct, ainsi que Integ ers de $, bools, caractères, DateTimes, etc.)
Les données suivantes sont stockées sur le tas:
- Le contenu des objets de type référence.
- Tout ce qui est structuré à l'intérieur d'un objet de type référence.
E.g.
Main()
{
MyClass obj = new MyClass();
}
Class MyClass
{
int32 i;
Dataset dst;
private void MyMethod(int32 j, dataset dst2)
{
int32 k;
Dataset dst3;
}
Voici les détails d'allocation de mémoire:
- obj qui est une référence d'objet - Stack
- instance de Myclass variable à laquelle obj pointe - Managed Heap
- Type de valeur variable membre i - Managed Heap
- dst qui est une référence d'objet de dataset - Managed Heap
- Instance de données et dans laquelle la variable dst pointe - Managed Heap
- paramètre de type valeur j - pile
- dst2 qui est une référence d'objet du jeu de données - pile
- instance du jeu de données à laquelle Dst2 variable est orientée - Géré Heap
- Valeur Type de variable locale k - Stack
- dst3 qui est une référence d'objet de jeu de données - Stack
- instance de jeu de données auquel est dst3 pointage - tas managé
Je pense avoir couvert toutes les permutations et combinaisons.
vous Voici un autre:
maintenant, comment objet de classe (tas) interagir avec myInt variable publique (stack)?
La première chose que je veux ajouter ici est que l'objet et les variables n'interagissent pas. C'est le code (instructions IL exécutables présentes dans une méthode) qui interagissent avec les variables publiques d'une instance de classe (objet appelé).
Voir, CLR ne charge un type qu'une seule fois en mémoire. Ainsi, toutes les instructions IL correspondant à votre méthode Display
seront placées en mémoire de manière centralisée quel que soit le nombre d'instances de la classe A
que vous créerez dans votre programme. Seules les instances (contenant des données de variables membres) de la classe A
occuperont une place différente (adresse mémoire pour être précise) dans le tas.
Chaque fois que l'instruction IL pour la méthode Display
est exécutée, elle a un pointeur vers this
qui est une référence à l'instance d'objet actuelle dans le segment de mémoire. this
La référence est différente pour différentes instances d'objet. this
pointe toujours vers la disposition d'adresse de la mémoire de départ de votre instance d'objet actuelle. De là, un décalage est nécessaire pour atteindre l'adresse de la mémoire où myInt
est situé pour y accéder/le modifier. J'espère que cela vous aidera à faire un modèle mental du fonctionnement du code C# sous le capot dans l'environnement CLR.
Ceci est spécifique à la langue. Si vous voulez dire spécifiquement Java ou C#, alors étiqueter la question en conséquence. – skaffman
J'ai mis à jour ma réponse afin qu'elle puisse vous aider à mieux comprendre comment le code C# est exécuté par CLR. Poster ce commentaire car il n'y a pas de notification pour l'auteur de la question dans SO pour les modifications qui se produisent dans les réponses déjà postées. – RBT