Warum verwenden Menschen magische Werte anstelle von null in ihrem Code?

8

Ich habe das in Legacy-Code und in einigen .NET-Open-Source-Projekten gesehen. Ich kann mir keinen Grund vorstellen, dies zu tun. Einfach nur "Null" zu benutzen, scheint mir viel einfacher.

Beispiel:

%Vor%

versus

%Vor%     
Paco 27.02.2009, 10:50
quelle

6 Antworten

11

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.

    
David 26.02.2009 17:48
quelle
4

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.

    
Eclipse 26.02.2009 17:24
quelle
3

Wenn ein Null-Objekt vorhanden ist, können Ausnahmen ausgelöst werden, während Fehlercodes (wie ein "-1" -Fehlerfall) keine Ausnahme auslösen.

Dies kann in Sprachen oder Anwendungen, die Ausnahmen nicht gut behandeln, kritisch sein.

    
DevinB 26.02.2009 16:49
quelle
2

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

    
chburd 26.02.2009 16:51
quelle
1

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.

    
Chris Shaffer 26.02.2009 17:32
quelle
0

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.

    
Andrew Hare 26.02.2009 16:48
quelle

Tags und Links