Tout d'abord, Nullable<int>
est juste un raccourci pour quelque chose comme:
struct Nullable<T>
{
bool hasValue;
T value;
}
plus tous les constructeurs, accesseurs, etc. C'est tout ce qu'il est - un int nullable est un int ordinaire plus un drapeau qui indique si l'int est nul ou non. Tout le reste est la magie du compilateur qui traite "null" comme une valeur valide; tout "null" fait avec un type Nullable vous rend une de ces structs avec l'indicateur mis à false.
Alors, maintenant que nous avons cela à l'écart, votre question est "où vont-ils en mémoire"? Ils vont au même endroit que tous les autres structs en mémoire: où le runtime et le compilateur croient être le meilleur endroit compte tenu de la durée de vie de la mémoire.
La plupart des structures vont sur le tas. Quiconque vous dit que «les structures vont toujours sur la pile» ne sait pas vraiment de quoi elles parlent; notre documentation ne dit pas cela et ce n'est pas vrai. Les structures ne vont que sur le pool de mémoire temporaire, alias "la pile", quand elles sont des variables locales ou temporaires, et les variables locales ne sont pas fermées sur les variables externes d'une méthode anonyme ou lambda, et les variables locales ne sont pas dans un itérateur bloc. Toutes les autres structures vont dans le tas dans notre implémentation.
Notez également qu'il n'y a aucune exigence qu'une implémentation de la CLI utilise "la pile" pour créer son pool temporaire. Le gestionnaire de mémoire JScript classique, par exemple, stocke son pool temporaire sur le tas. (Bien que le moteur d'exécution de JScript ne soit pas une implémentation de la CLI, je signale simplement que l'on peut concevoir un moteur d'exécution managé qui ne place aucune donnée utilisateur sur la pile.) Logiquement, il s'agit d'une structure de données , mais cette structure de données n'est pas stockée sur "la" pile, c'est juste une structure de pile allouée sur le tas.
Je dois demander: pourquoi vous en souciez-vous? Le CLR gère la mémoire en votre nom. Pourquoi vous souciez-vous des types nullables? Ils vont là où ils vivent assez longtemps pour vous être utiles; vous n'avez pas à vous en préoccuper.
Un très facile +1 de moi. Merci pour votre réponse épuisante. Je m'en soucie parce que je suis curieux. Je pense (peut-être naïvement) que c'est une information précieuse pour savoir ce qui se passe réellement derrière mon code. Je ne veux pas finir par coder quelque chose qui fait la magie de Dieu-sait-quelle. –
@Ondrej, si vous pensez que le support du compilateur Nullable est magique, essayez d'écrire une méthode IEnumerable avec des retours de rendement en utilisant une expression lambda contenant une fermeture. Ouvrez le programme résultant dans ildasm et jetez un oeil à ce que le compilateur a fait pour vous sous les couvertures. –
Je parlais généralement. Pas que je pense réellement que tout dans la programmation est une magie. Je suis conscient qu'il y a probablement plus de morceaux de code difficiles à comprendre que cela. –