Gibt es ein einfaches Attribut oder einen Datenvertrag, den ich einem Funktionsparameter zuweisen kann, der verhindert, dass null
er in C # /. NET übergeben wird? Im Idealfall wird dies auch zur Kompilierungszeit überprüft, um sicherzustellen, dass das Literal null
nirgendwo dafür verwendet wird, und zur Laufzeit ArgumentNullException
.
Zur Zeit schreibe ich so etwas wie ...
if (null == arg)
throw new ArgumentNullException("arg");
... für jedes Argument, das ich nicht erwarte null
.
In diesem Sinne gibt es ein Gegenteil davon, dass Nullable<>
Folgendes fehlschlagen würde:
NonNullable<string> s = null; // throw some kind of exception
c#
.net
parameters
null
Neil C. Obremski
quelle
quelle
Antworten:
Zur Kompilierungszeit ist leider nichts verfügbar.
Ich habe eine etwas hackige Lösung, die ich kürzlich in meinem Blog gepostet habe und die eine neue Struktur und Konvertierungen verwendet.
In .NET 4.0 mit dem Code Contracts- Material wird das Leben viel schöner. Es wäre immer noch sehr schön, eine tatsächliche Sprachsyntax und Unterstützung in Bezug auf Nicht-Nullbarkeit zu haben, aber die Codeverträge werden viel helfen.
Ich habe auch eine Erweiterungsmethode in MiscUtil namens ThrowIfNull, die es ein bisschen einfacher macht.
Ein letzter Punkt - irgendein Grund für die Verwendung von "
if (null == arg)
" anstelle von "if (arg == null)
"? Ich finde das letztere leichter zu lesen, und das Problem, das das erstere in C löst, gilt nicht für C #.quelle
if (null == x)
in natürlichen Sprachunterschieden liegt. Ich glaube, es geht wirklich um einen veralteten Stil, der sich nur durch Beispiele usw. verbreitet.Ich weiß, dass ich bei dieser Frage unglaublich spät dran bin, aber ich denke, dass die Antwort relevant wird, wenn die neueste Hauptiteration von C # der Veröffentlichung näher kommt und dann veröffentlicht wird. In C # 8.0 tritt eine wesentliche Änderung auf. In C # wird davon ausgegangen, dass alle Typen als nicht null betrachtet werden.
Laut Mads Torgersen:
Die von Mads skizzierte Entschließung lautet also:
Ein Beispiel für die gewünschte Funktion:
Die Vorschau ist für die Vorschau von Visual Studio 2017, 15.5.4+ verfügbar.
quelle
Ich weiß, dass dies eine SEHR alte Frage ist, aber diese fehlte hier:
Wenn Sie ReSharper / Rider verwenden, können Sie das Annotated Framework verwenden .
Bearbeiten : Ich habe gerade eine zufällige -1 für diese Antwort bekommen. Das ist gut. Beachten Sie jedoch, dass es immer noch gültig ist, auch wenn es nicht mehr der empfohlene Ansatz für C # 8.0 + -Projekte ist (um zu verstehen, warum, lesen Sie Gregs Antwort ).
quelle
Überprüfen Sie die Validatoren in der Unternehmensbibliothek. Sie können so etwas tun wie:
Dann in Ihrem Code, wenn Sie ihn validieren möchten:
quelle
nicht das schönste aber:
Mit der ContainsNullParameters-Methode können Sie auch kreativer werden:
Natürlich können Sie einen Abfangjäger oder eine Reflexion verwenden, aber diese sind mit geringem Aufwand leicht zu verfolgen / zu verwenden
quelle
return (from o in methodParams where o == null).Count() > 0;
Verwendung:return methodParams.Any(o=>o==null);
Es wird viel schneller bei großen Sammlungen seinOk, diese Antwort ist etwas spät, aber hier ist, wie ich sie löse:
Verwenden Sie diese Erweiterungsmethode, dann können Sie null und leere Zeichenfolgen als dasselbe behandeln.
Z.B
Ich weiß, dass es nicht ideal ist, da Sie daran denken müssen, überall Standard zu nennen, aber es ist eine Lösung.
quelle
string.IsNotNullOrEmpty
wirklich anders als der Zucker, das, was dir wichtig ist, auf der linken Seite zu haben. Kann in andere Funktionen (Länge, Verkettung) usw. eingespeist werden. Etwas besser.Default()
) auf null (model.Day
) sicher aufrufen können . Ich weiß, dass Erweiterungsmethoden nicht gegen Null geprüft werden, aber meine Augen sind sich dessen nicht bewusst und sie haben sich das bereits?
im Code vorgestellt:model?.Day?.Default()
:)