nullable string in C#
Kenne ich einen string in C# kann sein, 'nullable', indem Sie einfach mit null.
Ist aber, dass der Punkt der null-Arten ist, dass ich Hilfe aus dem compiler [edit : aka, in der Art error : kann nicht hinzufügen von apple-bananas]
Und mit Hilfe dieser 'Typ system hack-ish' der 'null-Zulässigkeit hängt von den zugrunde liegenden Typ' Pausen', was ich garantiert haben könnte (das ist keine geringe Leistung, wie das scheint der springende Punkt bei der Verwendung eines Typ-system in den ersten Platz..)
Welche sind die standard-Weg, um mit dieser in C#, wenn man will ?
Soll ich nur roll meine eigene 'nullable' Klasse ?
Bearbeiten
Lassen Sie mich anders formulieren Sie die Frage :
Was ist der standard-Weg, in C#, um sicherzustellen, dass eine variable, die Sie annotiert werden als null-Werte zulässt, nicht einer Variablen zugewiesen, die Sie nicht kommentieren, wie null-Werte zu.
Ist :
was ist der standard-Weg, um für alle Arten, genau das, was die ? Schlüsselwort gibt, die Sie für Wert geben.
- Ich verstehe nicht, Ihre Frage.
- Warum die
f#
tag? - Welche spezifischen problem erleben Sie?
- Die Frage ist : wie haben ein explizit nullable-Typ, das heißt, eine, die ompiler bekannt ist, so, dass ich einen Weg nicht weisen, die durch Irrtum eine "nicht-nullwertfähige' Zeichenkette, um eine null-Zeichenfolge.
- verstehen Sie nullable-Typen ?
- Tun Sie? Oder, besser geeignet, wissen Sie eigentlich, was Sie wollen in der Lage sein zu tun, dass Sie derzeit nicht, weil wir keine Ahnung haben, was Sie für Fragen basierend auf Ihre Frage. Vielleicht können Sie ein code-Beispiel, was nicht funktioniert und so konnten wir helfen Ihnen bei der Bewältigung Ihrer Probleme.
- denn dies ist ein ärgernis, dass man nicht in F#. So Stelle ich mir die meisten f# - Programmierer konfrontiert wurde und auf diese.
- Wie gesagt, ich versuche, die nullable-annotation für jeden Typ. also, wenn Sie nicht verstehen, entnehmen Sie bitte nullable-Typen.
- nicht, dass es furchtbar schwer, nur Rollen Sie Ihre eigenen, aber ich dachte mir die Menschen gegeben hatte, einige Gedanken auf die vor-und Nachteile von verschiedenen Optionen, die ich vielleicht nicht sehen.
- Die nullable-annotation ist nur der Wert für Arten, die nicht bereits null-Werte zulässt, nämlich Strukturen. Es gibt keine Möglichkeit für Sie, wenden Sie die annotation in einer Art, die bereits eine nullable-Typ. Es ist nicht möglich für Sie zu Rollen Sie Ihre eigenen nullable-Typ; zumindest bis zu dem Punkt, dass
Nullable
funktioniert. Mehrere Aspekte, die die Funktionalität benötigen, die compiler-Unterstützung, so dass Sie Ihre eigenenNullable
können nicht immer als feature-rich. - Diese Frage ist wahrscheinlich zu verwechseln mit C# Programmierer mit kein F# - Erfahrung, denn die zwei Sprachen Adresse, die null-Zulässigkeit auf sehr unterschiedliche Weise. Wenn die Frage wieder eröffnet, ich bin froh, in der post eine Antwort.
- Bei der hand, ich habe eine Reihe von DBNull.Wert, null, leere Zeichenketten, nullables, die sich alle definieren, die Nichtigkeit im Rahmen dieses c# - Programm. sehr interessant, mit zu arbeiten !
- Die Frage wurde wieder geöffnet. Ich wäre interessiert an Ihre Antwort, denn ich glaube nicht, dass es möglich ist, dies zu erreichen. Ich wies die Antwort selbst erklären meine Gedanken.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie Fragen zu einem Weg, um sicherzustellen, dass der Rückgabetyp einer bestimmten Methode ist nicht
null
gibt es eine Lösung:Diese Methode hat einen Rückgabewert geben. Jede Methode gibt einen Verweis geben kann potenziell zurück
null
. Es gibt nichts, was Sie dagegen tun können.So, Sie konnte erstellen eine
struct
wie diese in der Lage sein, um einen Wert zurückzugeben Typ:Ihre Methode soll einen string zurückgeben, können nun zurück
SurelyNotNull<string>
.Das problem bei diesem Ansatz ist:
Es funktioniert nicht. Während der Rückgabewert der Methode ist garantiert nicht
null
ist, ist der Rückgabewert vonSurelyNotNull<T>.Value
ist nicht. Auf den ersten Blick sieht es aus wie es ist garantiert nicht null. Aber es kann sein, aufgrund von:Jeder struct hat einen impliziten, öffentlichen, parameterlosen Konstruktor, auch wenn ein anderer Konstruktor definiert ist.
Der folgende code ist gültig und läßt sich mit der
struct
von oben:Fazit:
In C#, Sie sind nicht in der Lage zu erreichen, was Sie versuchen zu tun.
Sie können immer noch diese Methode verwenden, Sie brauchen nur zu verstehen, dass jemand könnte diese Art und produzieren immer noch einen null-Wert. Scheitern fallen in diesem Szenario, wäre es eine gute Idee, fügen Sie einen Scheck an die getter der
Value
und eine Ausnahme werfen, wenn_value
null ist.Value
nichtnull
, so dass, wenn Sie mit statischer code-checker wie ReSharper oder Code-Verträge würden Sie noch erhalten, eine ganze Reihe von "Möglichen Verwendung von null" - Nachrichten.SurelyNotNull<T>.Value
getter, wie gut.Als Daniel Hilgarth wies darauf hin, es gibt keine kugelsichere Weg, dies zu erreichen. Mein Vorschlag ist ähnlich zu sein, aber mit einigen zusätzlichen Sicherheit. Sie können selbst entscheiden, ob die Vorteile überwiegen die Kosten für die Verwendung eines wrapper-Typ in Ihrem gesamten Programm.
Den wrapper-Typ ist in Erster Linie, um Ihren Vorsatz selbst dokumentieren, also ist es unwahrscheinlich, dass Sie würde es umgehen mit null initialisiert struct, aber es hält eine Flagge, um anzuzeigen, dass es initialisiert wurde, trotzdem richtig. In dieser zugegebenermaßen ungewöhnlichen Fall, wird es werfen eine
ArgumentNullException
beim Zugriff auf den Wert.Nun, ist das besser als eine gelegentliche NRE? Vielleicht. Es kann sparen eine Menge boilerplate-arg-Prüfung. Sie müssen entscheiden, ob es sich lohnt für Ihre situation. Kurz compiler-Unterstützung, wie F# bietet, gibt es keine Möglichkeit, compile-time-null Sicherheit, aber man kann (wohl) einfache Laufzeit-Sicherheit.
Möchten Sie vielleicht, um up-Abstimmung in dieser Frage auf Microsoft ' s Kunden-feedback Ort: Hinzufügen null-Referenz-Typen in C#
null
ist eines der größeren Probleme in den aktuellen Sprachen. Zu deinem code: Deine implizite Betreiber vonT
zuNonNull
entfernt viel compile-Zeit geben Sicherheit, denn Sie ermöglichtIsEmptyString(null)
zu kompilieren. Ich denke, es wäre besser, Sie nicht.value
kann nicht einValueType
aufgrund der Einschränkungwhere T : class
. Plus, dieses Problem gilt nur für Referenz-Typen.Du willst so etwas wie eine NotNull Attribut. Mit diesen wird Ihnen der Kompilierung Warnungen und Fehler und in einigen Fällen IDE-feedback über das zuweisen von NULL-Werten zu NotNull-Attribute.
Siehe diese Frage :C#: Wie zu Implementieren und zu verwenden eine NotNull und CanBeNull Attribut
Alle Referenz-Typen null-Werte zulassen. String ist ein Referenztyp.
Nullable<T>
, die spezielle compiler-Unterstützung), dann kann man nicht. Wenn Sie eine generische Methode und so nicht wissen, die Art, können Sie entwederdefault(T)
werdennull
für alle nullable-Typen, oderwhere T : class
um sicherzustellen, dass nur Referenztypen gültig sind Allgemeine Argumente.