Le pointeur d'objet de type est utilisé pour représenter le type de l'objet. Ceci est nécessaire pour:
- Méthode recherche (le vtable)
- Checking jette
- Trouver l'objet
Type
si vous appelez GetType
.
Le champ syncblock est principalement utilisé pour le verrouillage. Il n'est rempli que quand il doit l'être, et quand un verrou est toujours incontesté, le CLR se contente d'un verrou "fin" qui ne nécessite aucune donnée externe. Sinon, c'est une entrée dans une table à l'échelle du processus - je ne connais pas les détails de la table, mais j'imagine que c'est une liste de threads qui attendent sur le moniteur de l'objet. Bien sûr, le bit d'information le plus important est de savoir si le verrou est actuellement maintenu, par quel thread, et quel en est le nombre (en raison de la nature réentrante des verrous .NET).
Le syncblock est également rempli si vous appelez GetHashCode()
et qu'il n'est pas remplacé - il utilise la table à l'échelle du processus pour allouer un nombre stable, fondamentalement. (L'adresse de l'objet n'est pas assez bonne car elle peut changer au fil du temps.)
Étant donné que tous les objets sont d'un type spécifique, comment le runtime est-il supposé savoir à moins qu'il n'enregistre le type quelque part ...? Ne vous inquiétez pas de lire ce genre de choses, s'inquiéter de votre propre code. –
@mP Exactement - alors pourquoi n'enregistre-t-il pas cette information pour les types de valeur? Cela vaut toujours la peine de savoir comment fonctionnent vos outils. – TarkaDaal