Um einen "Null" -Wert zu haben, muss der Typ Nullwert haben. Dies funktioniert für Referenztypen (jede von Ihnen definierte Klasse und die Standardbibliothek). Wenn Sie nachsehen, sehen Sie, dass Personen tun null verwenden, wenn sie ein Referenzobjekt ohne Wert haben
%Vor%Das Problem tritt auf, wenn Sie die Typen value wie int, char oder float verwenden. Im Gegensatz zu Referenztypen, die auf einen Datenblock irgendwo anders im Speicher zeigen, werden diese Werte inline gespeichert und manipuliert (es gibt keinen Zeiger / Verweis).
Aus diesem Grund haben die Werttypen standardmäßig keinen Nullwert . In dem von Ihnen bereitgestellten Code ist es unmöglich , dass parentID null ist (ich bin wirklich überrascht, dass dies sogar von Ihrem Compiler erreicht wurde - Visual Studio 2008 und wahrscheinlich 2005 werden eine grüne Unterstreichung ziehen und Ihnen sagen, dass Aussage ist immer falsch).
Damit ein int einen Nullwert hat, müssen Sie es als nullable deklarieren
%Vor%Jetzt parentID kann einen Nullwert enthalten, weil es jetzt ein -Zeiger (also "Referenz") für eine 32-Bit-Ganzzahl statt nur für eine 32-Bit-Ganzzahl ist.
Du verstehst hoffentlich, warum "magische Werte" oft verwendet werden, um Null mit den Grundtypen (Werttypen) darzustellen. Es ist einfach eine Menge Ärger und oft ein großer Leistungseinbruch (Nachschlagen was Boxing / Unboxing ist), diese Werttypen als Referenz auf den Wert zu speichern, damit sie null sein können.
Bearbeiten: Weitere Informationen zum Boxing / Unboxing (was Sie benötigen, um ein int == null zu haben), finden Sie im Artikel unter MSDN :
Boxen und Unboxing (C # -Programmierhandbuch)
Leistung
In Bezug auf einfache Zuweisungen sind Boxen und Unboxing rechenintensive Prozesse. Wenn ein Werttyp eingerahmt ist, muss ein neues Objekt zugewiesen und aufgebaut werden. In geringerem Maße ist die zum Unboxing erforderliche Besetzung auch rechnerisch aufwändig. Weitere Informationen finden Sie unter Leistung.
Dies sind oft Gewohnheiten, die beim Programmieren in C entwickelt wurden. Viele C-Programmierer wären verachtet, wenn sie Nullable-Ints verschwenden, die zumindest ein ganzes Extra-Bit und möglicherweise sogar einen Zeiger erfordern. Dies ist besonders schlimm, wenn Sie wissen, dass der Wert positiv ist und Sie den gesamten Raum mit negativen Werten für Flags verwenden. -1 kann bedeuten, nicht gesetzt, -2 kann bedeuten, dass parentId im Kontext dieses Knotens nicht einmal Sinn ergibt, -3 kann bedeuten, dass der Knoten ein Elternteil hatte, das mit der Arbeit nicht umgehen konnte und auf einem Trinkgelage blieb und wurde nie wieder gesehen, etc ...
In der C # -Welt bedeutet die Reinheit von Nullable-Ints (und ihre einfache Integration mit RDMS) zusammen mit Computern mit 2 GB RAM, dass die alten C-Gewohnheiten langsam sterben, aber alte Gewohnheiten sterben schwer.
Wenn ich an großen Datawarehouses arbeite, benutze ich manchmal den Wert 0, wenn null, um einen Nicht-Null-Wert in meinen Cube einzufügen. Ich habe immer eine ID 0, die dem Wert 'Unbekannt' in allen Dimensionen entspricht, also habe ich einen Würfel ohne Nullwerte.
das Hauptinteresse besteht darin, einfachere und effizientere Abfragen zu haben
Nullable-Werttypen sind nicht in jeder Sprache / Umgebung verfügbar. Sie wurden zu .Net 2.0 hinzugefügt. Wenn Ihr Legacy-Code .Net-basiert ist und mit dem 1.1-Framework gestartet wurde, lautet Ihre Antwort, dass null zu der Zeit keine Option war.
Haben Sie wirklich in die Anwendung geschaut, um zu sehen? Solange die magische Zahl an einem einzigen Ort mit einem beschreibenden Namen gespeichert ist, kann es sehr nützlich sein.
Tags und Links magic-numbers