First off, Nullable<int>
ist nur eine Abkürzung für so etwas wie:
struct Nullable<T>
{
bool hasValue;
T value;
}
plus alle Konstruktoren, Accessoren und so weiter. Das ist alles, was es ist - ein Nullable-Int ist ein gewöhnlicher Int plus ein Flag, das angibt, ob der Int null ist oder nicht. Der ganze Rest ist Compiler Magie, die "Null" als gültigen Wert behandelt; Alles was "null" mit einem Nullable-Typ ist, macht Sie zu einer dieser Strukturen mit dem Flag false.
So jetzt, wo wir das aus dem Weg haben, ist Ihre Frage "wohin gehen sie in Erinnerung"? Sie gehen an die gleiche Stelle, an der andere Strukturen in Erinnerung bleiben: Wo die Laufzeit und der Compiler angesichts der Lebensdauer des Speichers der beste Ort sind.
Die meisten Strukturen gehen auf den Haufen. Jeder, der Ihnen sagt, dass "Strukturen immer auf den Stapel gehen", weiß nicht, worüber sie sprechen. Unsere Dokumentation sagt das nicht und es ist nicht wahr. Structs gehen nur in den temporären Speicherpool, auch "der Stapel" genannt, wenn es sich um lokale Variablen oder Provisorien handelt, und die lokalen Variablen sind keine geschlossenen äußeren Variablen einer anonymen Methode oder Lambda und die lokalen Variablen befinden sich nicht in einem Iterator Block. Alle anderen Strukturen gehen in unserer Implementierung auf den Heap.
Beachten Sie auch, dass es keinerlei Anforderung gibt, dass eine CLI-Implementierung "den Stapel" verwendet, um ihren temporären Pool zu erstellen. Der klassische JScript-Speichermanager speichert beispielsweise seinen temporären Pool auf dem Heap. (Obwohl die JScript-Laufzeit-Engine natürlich keine Implementierung der CLI ist, möchte ich nur darauf hinweisen, dass man eine verwaltete Laufzeit-Engine entwerfen kann, die keinerlei Benutzerdaten auf den "Stack" legt.) Logischerweise handelt es sich um eine Stack-Datenstruktur , aber diese Datenstruktur wird nicht auf "dem" Stapel gespeichert, es ist nur eine Stapelstruktur, die auf dem Heap zugewiesen ist.
Ich muss fragen: warum kümmert es dich? Die CLR verwaltet den Speicher in Ihrem Namen. Warum interessiert es dich, wo Nullable Typen gehen? Sie gehen lange genug dorthin, wo sie leben, um dir nützlich zu sein. du musst dir darüber keine Sorgen machen.
Eine sehr einfache +1 von mir. Danke für die erschöpfende Antwort. Es interessiert mich, weil ich neugierig bin. Ich denke (naiv genug), dass es wertvolle Informationen gibt, um zu wissen, was tatsächlich hinter meinem Code passiert. Ich möchte nicht am Ende etwas kodieren, das weiß, was Magie ist. –
@Ondrej, wenn Sie der Meinung sind, dass die Nullable Compiler-Unterstützung magisch ist, versuchen Sie, eine IEnumerable-Methode mit yield returns mit einem Lambda-Ausdruck zu schreiben, der eine Closure enthält. Öffnen Sie das resultierende Programm in ildasm und schauen Sie sich an, was der Compiler unter der Decke für Sie getan hat. –
Ich habe allgemein gesprochen. Nicht, dass ich eigentlich denke, dass alles in der Programmierung eine Magie ist. Ich bin mir bewusst, dass es höchstwahrscheinlich schwer verständliche Codeabschnitte gibt, als dies der Fall ist. –