Ich habe ein DTO, das durch Lesen aus einer DynamoDB-Tabelle gefüllt wird. Angenommen, es sieht derzeit so aus:
public class Item
{
public string Id { get; set; } // PK so technically cannot be null
public string Name { get; set; } // validation to prevent nulls but this doesn't stop database hacks
public string Description { get; set; } // can be null
}
Gibt es bewährte Verfahren, um damit umzugehen? Ich würde lieber einen nicht parameterlosen Konstruktor vermeiden, da dies mit dem ORM im Dynamo SDK (und anderen) schlecht funktioniert.
Es scheint mir seltsam zu schreiben, public string Id { get; set; } = "";
weil dies niemals passieren wird , da Id
es sich um eine PK handelt und niemals null sein kann. Was würde ""
es nützen , selbst wenn es irgendwie wäre?
Also eine Best Practice dazu?
- Sollte ich sie alle markieren, um
string?
zu sagen, dass sie null sein können, obwohl einige es niemals sein sollten. - Soll ich initialisieren
Id
undName
mit ,""
weil sie sollte nie sogar null und zeigt dies die Absicht sein , obwohl""
nie verwendet werden. - Eine Kombination von oben
Bitte beachten Sie: Hierbei handelt es sich um nullbare C # 8- Referenztypen. Wenn Sie nicht wissen, welche am besten geeignet sind, antworten Sie nicht.
c#
c#-8.0
non-nullable
nullable-reference-types
Britischer Entwickler
quelle
quelle
#pragma warning disable CS8618
oben in die Datei klatschen.= ""
können Sie= null!
eine Eigenschaft initialisieren, von der Sie wissen, dass sie niemals effektiv sein wirdnull
(wenn der Compiler keine Möglichkeit hat, dies zu wissen). WennDescription
es legal sein kannnull
, sollte es als a deklariert werdenstring?
. Wenn die Überprüfung der Nullfähigkeit für das DTO eher störend als hilfreich ist, können Sie den Typ alternativ einfach in#nullable disable
/#nullable restore
umbrechen, um NRTs nur für diesen Typ zu deaktivieren.Antworten:
Optional können Sie das
default
Literal in Kombination mit dem verwendennull forgiving operator
Da Ihr DTO aus DynamoDB gefüllt ist, können Sie
MaybeNull/NotNull
Nachbedingungsattribute verwenden , um die Nullfähigkeit zu steuernMaybeNull
Ein nicht nullbarer Rückgabewert kann null sein.NotNull
Ein nullbarer Rückgabewert ist niemals null.Diese Attribute wirken sich jedoch nur auf die Nullwertanalyse für die Anrufer von Mitgliedern aus, die mit Anmerkungen versehen sind. In der Regel wenden Sie diese Attribute auf Methodenrückgaben, Eigenschaften und Indexer-Getter an.
Sie können also alle Ihre Eigenschaften als nicht nullwertfähig betrachten und sie mit
MaybeNull
Attributen dekorieren, um anzuzeigen, dass sie einen möglichennull
Wert zurückgebenDas folgende Beispiel zeigt die Verwendung der aktualisierten
Item
Klasse. Wie Sie sehen können, zeigt die zweite Zeile keine Warnung, die dritte jedochOder Sie können alle Eigenschaften auf Null setzen und
NoNull
damit angeben, dass der Rückgabewert nicht sein kannnull
(Id
zum Beispiel).Die Warnung ist dieselbe wie im vorherigen Beispiel.
Es gibt auch
AllowNull/DisallowNull
Vorbedingungsattribute für Eingabeparameter, Eigenschaften und Indexer-Setter, die auf ähnliche Weise arbeiten.AllowNull
Ein nicht nullbares Eingabeargument kann null sein.DisallowNull
Ein nullbares Eingabeargument sollte niemals null sein.Ich denke nicht, dass es Ihnen helfen wird, da Ihre Klasse aus der Datenbank gefüllt ist, aber Sie können sie verwenden, um die Nullbarkeit von Eigenschaftensetzern zu steuern, wie dies für die erste Option der Fall ist
Und für den zweiten
Einige hilfreiche Details und Beispiele für Post / Voraussetzungen finden Sie in diesem Devblog-Artikel
quelle
Die Lehrbuchantwort in diesem Szenario besteht darin, ein
string?
für IhreId
Immobilie zu verwenden, es aber auch mit dem[NotNull]
Attribut zu dekorieren :Also, was genau ist hier los?
string?
verhindert , dass Rückgabetyp der Compiler Sie warnen , dass die Eigenschaft während der Bauphase nicht initialisiert ist und somit standardmäßig zunull
.[NotNull]
verhindert das Attribut eine Warnung, wenn die Eigenschaft einer nicht nullbaren Variablen zugewiesen wird oder versucht wird, sie zu dereferenzieren, da Sie die statische Flussanalyse des Compilers darüber informieren , dass diese Eigenschaft in der Praxis niemals sein wirdnull
.Um diese Verpflichtung aufrechtzuerhalten, möchten Sie die Eigenschaft möglicherweise zusätzlich mit dem folgenden
[DisallowNull]
Attribut versehen:Dies ist in Ihrem Fall möglicherweise nicht relevant, da die Werte über die Datenbank zugewiesen werden. Das
[DisallowNull]
Attribut gibt jedoch eine Warnung aus, wenn Sie jemals versuchen, einennull
(fähigen) Wert zuzuweisenId
, obwohl der Rückgabetyp dies ansonsten zulässt null . In dieser HinsichtId
würde sich genau wie bei derstring
statischen Flussanalyse von C # verhalten, während gleichzeitig der Wert zwischen der Konstruktion des Objekts und der Grundgesamtheit des Grundstücks nicht initialisiert werden kann.quelle
String ist ein Referenztyp und immer nullbar. Sie müssen nichts Besonderes tun. Sie könnten erst später Probleme haben, wenn Sie diesen Objekttyp einem anderen zuordnen möchten, aber Sie können dies später behandeln.
quelle