Frage

Ich habe für ein paar gute Führung auf dieser Suche, da das Konzept in .net 2.0 eingeführt wurde.

Warum soll ich jemals Nicht-Nullable-Datentypen in C # verwenden? (Eine bessere Frage ist, warum soll ich nicht auf NULL festlegbaren Typen standardmäßig wählen, und verwenden Sie nur Nicht-Nullable-Typen, wenn dieser explizit Sinn macht.)

Gibt es eine ‚signifikant‘ Performance-Einbußen einen Nullable-Datentyp über seine Nicht-Nullable-Peer-to-Wahl?

ich viel lieber meinen Wert gegen null zu prüfen, statt Guid.empty, String.Empty, DateTime.MinValue, <= 0, usw. und mit Nullable-Typen im Allgemeinen zu arbeiten. Und der einzige Grund, warum ich nicht wählen, Nullable Types ist häufiger das juckende Gefühl im Hinterkopf, die mich als Rückwärtskompatibilität fühlen, wie es ist mehr macht, dass die Extra-Kräfte ‚?‘ Zeichen explizit einen Nullwert zu ermöglichen.

Gibt es jemanden gibt, die immer (fast immer) Nullable Types eher als Nicht-Nullable-Typen wählt?

Vielen Dank für Ihre Zeit,

War es hilfreich?

Lösung

Der Grund, warum man nicht immer auf NULL festlegbaren Typen verwenden soll, ist, dass manchmal sind in der Lage zu garantieren Sie, dass ein Wert von wird initialisiert werden. Und Sie sollten versuchen, Ihren Code so zu gestalten, dass dies der Fall, so oft wie möglich ist. Wenn es keine Möglichkeit ein Wert ist möglicherweise nicht initialisiert werden kann, dann gibt es keinen Grund, warum null ein zulässiger Wert für sie sein sollte. Als ein sehr einfaches Beispiel, betrachten Sie diese:

List<int> list = new List<int>()
int c = list.Count;

Dies ist immer gültig. Es gibt keine Möglichkeit, in denen c nicht initialisiert werden kann. Wenn es in ein int? gedreht wurde, würden Sie effektiv Leser des Codes sein zu sagen „dieser Wert könnte null sein. Stellen Sie sicher, zu überprüfen, bevor Sie es benutzen“. Aber wir wissen, dass dies nie passieren, also warum diese Garantie nicht aussetzen im Code?

Sie haben völlig Recht in Fällen, in denen ein Wert ist optional. Wenn wir eine Funktion, die eine Zeichenfolge nicht zurückkehren kann oder nicht, dann null zurück. Nicht zurück string.Empty (). Nicht zurück „magische Werte“.

Aber nicht alle Werte sind optional. Und alles, was optional machen macht den Rest des Codes weitaus komplizierter (es ist ein weiterer Codepfad, der behandelt werden muss).

Wenn Sie speziell garantieren können, dass dieser Wert immer gültig sein wird, dann werfen, warum diese Informationen weg? Das ist, was Sie tun, indem es ein Nullable Type zu machen. Nun kann der Wert oder nicht vorhanden ist, und jemand den Wert mit müssen beide Fälle behandeln. Aber Sie wissen, dass nur einer dieser Fälle ist möglich, in erster Linie. So tun Nutzer des Codes einen Gefallen, und beziehen sich diese Tatsache in Ihrem Code. Alle Benutzer Ihres Codes können dann verlassen sich auf den Wert gültig, und sie müssen nur einen einzigen Fall behandeln, anstatt zwei.

Andere Tipps

Weil es unbequem ist, immer zu überprüfen, ob die Nullable Type null ist.

Natürlich gibt es Situationen, in denen ein Wert wirklich optional ist, und in diesen Fällen ist es sinnvoll eine Nullable Type zu verwenden, anstatt magische Zahlen usw., aber wenn möglich, würde ich versuchen, sie zu vermeiden.

// nice and simple, this will always work
int a = myInt;

// compiler won't let you do this
int b = myNullableInt;

// compiler allows these, but causes runtime error if myNullableInt is null
int c = (int)myNullableInt;
int d = myNullableInt.Value;    

// instead you need to do something like these, cumbersome and less readable
int e = myNullableInt ?? defaultValue;
int f = myNullableInt.HasValue ? myNullableInt : GetValueFromSomewhere();

Ich denke, die Sprache Designer das Gefühl, dass ‚Referenztypen NULL festlegbare standardmäßig ist‘ ein Fehler war, und dass nicht-nullable ist die einzige vernünftige Standard, und Sie sollten in nullness entscheiden müssen. (Dies ist, wie es in vielen modernen funktionalen Sprachen ist.) „Null“ ist in der Regel ein Haufen Ärger.

Sie scheinen zwei verschiedene Fragen zu haben ...

  

Warum soll ich jemals Nicht-Nullable-Datentypen in C # verwenden?

Einfach, weil die Wert-Typ-Daten, die Sie auf angewiesen sind durch den Compiler garantiert wird, um tatsächlich einen Wert haben!

  

Warum soll nicht wählen, ich NULL festlegbare Typen standardmäßig und nur Nicht-Nullable-Typen verwenden, wenn diese explizit Sinn macht?

Wie Joel bereits erwähnt, kann ein Typ nur null sein, wenn es sich um ein Referenztyp ist. Werttypen werden vom Compiler garantiert einen Wert zu haben. Wenn Ihr Programm auf einer Variablen abhängt einen Wert hat, dann ist dies das Verhalten wollen Sie nicht ein Nullable Type wählen.

Natürlich, wenn Sie Ihre Daten von überall kommen, das ist nicht Ihr Programm, sind alle Wetten ausgeschaltet sind. Das beste Beispiel ist aus einer Datenbank. Datenbankfelder werden null, so dass Sie Ihre Programmvariablen diesen Wert imitieren wollen würden - nicht nur einen „magischen“ Wert schaffen (d -1, 0, oder was auch immer), dass „für“ null. Sie tun dies mit Nullable-Typen.

Obwohl Nullwerte können für die Verwendung als „nicht initialisiert-noch“ oder „not-specified“ Werte bequem sein, sie machen den Code komplexer, vor allem, weil Sie eine Überlastung der Bedeutung von null sowie die variablen (zahlen~~POS=TRUNC oder null vs. just-a-Nummer).

NULL-Werte werden von vielen Datenbank-Designern und SQL-Datenbank-Programmierer bevorzugt aber mit einer kleinen Änderung über das Problem im Denken Sie mit Nullwerten abschaffen können und tatsächlich einfacher und zuverlässiger Code (zum Beispiel keine Gedanken über NullReferenceExceptions).

Es gibt tatsächlich eine große Nachfrage nach einem „T“ Betreiber, die jeden Referenztyp Nicht-NULL-Werte zulässt, ähnlich wie macht „T?“ NULLABLE macht Werttypen und Anders Hejlsberg, der Erfinder von C #, wollte er die Fähigkeit eingeschlossen hatte.

Siehe auch die Frage, Warum ist „null“ in C # und Java?

Ich neige dazu, Nullable Typen zu verwenden, wo immer sie Sinn machen - ich werde über die Leistung nicht kümmern, bis es ein Problem ist, dann werde ich die wenige Bereiche fixiert, wo es ist, und mit ihm getan werden

.

Allerdings finde ich auch in der Regel, dass die meisten meiner Werte am Ende als nicht-nullable. In der Tat gibt es viele Male ich würde tatsächlich wie ein NotNullable ich mit Referenztypen, um sich über ein Null-Problem verwenden können, wenn ich die Null bekommen, nicht später, wenn ich versuche, es zu benutzen.

Das einzige Mal, dass ein Nullable Type jemals verwendet werden soll, ist in dem Fall, dass ein bestimmtes Feld in einer Tabelle der Datenbank unbedingt erforderlich, dass eine Null durch die zu einem bestimmten Zeitpunkt Anwendung gesendet oder empfangen werden. Selbst in einem solchen Fall sollte man immer versuchen, einen Weg zu finden, um den Nullable Type verwenden. Bool ist nicht immer dein bester Freund.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top