Warum sollte ich nicht immer verwenden von auf null festlegbaren Typen in C#
Ich habe die Suche nach einige gute Anleitungen zu diesem, da der Begriff eingeführt wurde .net 2.0.
Warum würde ich jemals wollen, um die Verwendung von nicht-nullable-Datentypen in c#? (Eine bessere Frage ist, warum sollte ich nicht wählen nullable-Typen, standardmäßig, und verwenden Sie nur nicht-nullable-Typen, wenn das ausdrücklich Sinn macht.)
Ist es ein "signifikanter" Leistung trifft, um die Wahl einer nullable-Datentyp, über seine null-peer?
Ich viel lieber überprüfen meiner Werte gegen null anstelle von Guid.empty, string.leere DateTime.MinValue,<= 0, etc, und arbeiten mit nullable-Typen im Allgemeinen. Und der einzige Grund, warum ich nicht wählen nullable-Typen mehr oft ist die juckende Gefühl in der Rückseite von meinem Kopf, gibt mir das Gefühl, es ist mehr als rückwärts-Kompatibilität, die Kräfte, extra'? ' - Zeichen, um explizit einen null-Wert zulassen.
Ist da draußen jemand, der immer (fast immer) wählt nullable-Typen eher als non-nullable-Typen?
Vielen Dank für Ihre Zeit,
InformationsquelleAutor der Frage Matthew Vines | 2009-05-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund, warum Sie sollten nicht immer verwenden von auf null festlegbaren Typen ist, dass manchmal Sie sind in der Lage zu garantieren, dass ein Wert wird initialisiert werden. Und Sie sollten versuchen, Ihre design-code, so dass dies der Fall ist, so oft wie möglich. Wenn es keine Möglichkeit gibt, einen Wert kann möglicherweise nicht initialisiert werden, dann gibt es keinen Grund, warum das null sein sollte, einer juristischen Wert. Als ein sehr einfaches Beispiel, betrachten Sie dieses:
Dies ist immer gültig. Es gibt keine Möglichkeit, in der
c
konnte nicht initialisiert werden. Wenn es verwandelte sich in eineint?
würden Sie effektiv sagen die Leser des Codes "dieser Wert kann null sein. Stellen Sie sicher, zu überprüfen, bevor Sie es verwenden". Aber wir wissen, dass dies nie passieren, also, warum nicht setzen diese Garantie in den code?Du absolut Recht, in Fällen, in denen ein Wert ist optional. Wenn wir eine Funktion haben, die kann oder kann nicht einen string zurückgeben, dann wird null zurückgegeben. Nicht zurückgegebene Zeichenfolge.Empty(). Nicht wieder "Magische Werte".
Aber nicht alle Werte sind optional. Und macht alles optional macht den rest von deinem code viel komplizierter (es fügt einen anderen code-Pfad, muss behandelt werden).
Wenn Sie konkret sichergestellt, dass dieser Wert wird immer gültig sein, warum dann wegwerfen? Das ist, was Sie tun, indem Sie eine nullable-Typ. Jetzt ist der Wert möglicherweise oder möglicherweise nicht vorhanden, und jeder, der Wert wird sich mit beiden Fällen. Aber Sie wissen, dass nur in einem dieser Fälle möglich ist, in den ersten Platz. So müssen die Nutzer des Codes einen gefallen, und spiegeln diese Tatsache in Ihrem code. Jeder Nutzer kann der code dann verlassen Sie sich auf den Wert, der gültig ist, und Sie nur haben, um einen einzigen Fall, als zwei.
InformationsquelleAutor der Antwort jalf
Weil es unbequem ist, immer zu überprüfen, ob die nullable-Typ ist
null
.Natürlich gibt es Situationen, in denen ein Wert ist wirklich optional, und in diesen Fällen macht es Sinn, eine nullable-Typ eher als "Magische zahlen" usw, sondern, wo möglich, würde ich versuchen, Sie zu vermeiden.
InformationsquelleAutor der Antwort LukeH
Ich denke, die Sprache-Designer das Gefühl, dass die Referenz-Arten nullable " standardmäßig ein Fehler war, und dass keine null-Werte zulassen, ist der einzige sinnvolle Standard, und Sie sollten opt-in nullness. (Dies ist, wie es in vielen modernen funktionalen Sprachen.) "null" ist in der Regel einen Haufen ärger.
InformationsquelleAutor der Antwort Brian
Sie zu haben scheinen 2 unterschiedliche Fragen...
Einfach, weil Sie den Wert-Typ der Daten Sie sich darauf verlassen, garantiert der compiler, um tatsächlich einen Wert haben!
Wie Joel bereits erwähnt hat, ein Typ kann nur null sein, wenn es eine Referenz geben. Wert-Typen sind garantiert der compiler einen Wert haben. Wenn Ihr Programm beruht auf einer variable einen Wert haben, dann ist dies das Verhalten, das Sie wollen, indem Sie nicht wählen Sie eine nullable-Typ.
Natürlich, wenn Ihre Daten kommen von überall, dass ist nicht dein Programm, dann sind alle Wetten ab. Das beste Beispiel ist aus einer Datenbank. Datenbank-Felder können
null
so würden Sie wollen, dass Ihr Programm variabel zu imitieren, um dieses Wert - nicht nur erstellen, eine "Magie" - Wert (also -1, 0 oder was auch immer), die "repräsentiert"null
. Sie tun dies mit nullable-Typen.InformationsquelleAutor der Antwort John Rasch
Obwohl die null-Werte kann bequem sein für den Einsatz als "nicht-initialisiert-noch" oder "nicht-angegeben" Werte, Sie machen den code komplexer, vor allem, weil Sie überladen die Bedeutung von
null
sowie die variable (Zahl-oder-null-vs. nur-eine-Nummer).NULL-Werte begünstigt werden, die von vielen Datenbank-Designer und SQL-Datenbank-Programmierer, aber mit einer kleinen änderung im denken über das problem, das Sie tun können, Weg mit null-Werten und tatsächlich, einfacher und zuverlässiger code (z.B. keine Gedanken über
NullReferenceException
s).Gibt es eigentlich eine große Nachfrage für eine "T!" operator, keine macht, den Typ der Referenz nicht-null-Werte zulässt, ähnlich wie "T?" macht Wert-Typen, die null-Werte zulässt, und Anders Hejlsberg, dem Erfinder von C#, wünschte, er hätte die Möglichkeit eingebaut.
Siehe auch die Frage, Warum ist die "null" in java und C#?
InformationsquelleAutor der Antwort Mark Cidade
Ich Neige dazu, verwenden von auf null festlegbaren Typen, wo immer Sie Sinn machen -- ich werde keine sorgen über die performance, bis es ein problem, dann werd ich fix zu den wenigen Bereichen, wo es ist und mit ihm getan werden.
Aber ich finde auch, dass im Allgemeinen, die meisten meiner Werte am Ende wird nicht auf null gesetzt werden. In der Tat, es gibt viele Male, ich würde eigentlich gerne eine NotNullable, die ich verwenden kann mit Referenz-Typen, um herauszufinden, über ein null-problem, wenn ich die null nicht später auf, wenn ich versuche, es zu benutzen.
InformationsquelleAutor der Antwort Jonathan Rupp
Das einzige mal, dass ein Nullable-Typ sollte nie verwendet werden, ist in dem Fall, dass ein bestimmtes Feld in einer Tabelle der Datenbank ist unbedingt erforderlich, dass eine null gesendet oder empfangen werden durch die Anwendung an einem gewissen Punkt. Auch in einem solchen Fall sollte man immer versuchen, einen Weg zu finden, um mit der Nullable-Typ. Bool ist nicht immer dein bester Freund.
InformationsquelleAutor der Antwort Flagrum