Ich habe diese Funktion in einem Projekt mit DTO-Klassen (Data Transfer Object) aktiviert, wie unten angegeben:
public class Connection
{
public string ServiceUrl { get; set; }
public string? UserName { get; set; }
public string? Password { get; set; }
//... others
}
Aber ich bekomme den Fehler:
CS8618
: Die nicht nullbare Eigenschaft 'ServiceUrl' ist nicht initialisiert. Erwägen Sie, die Eigenschaft als nullbar zu deklarieren.
Dies ist eine DTO-Klasse, daher initialisiere ich die Eigenschaften nicht. Dies liegt in der Verantwortung des Codes, der die Klasse initialisiert, um sicherzustellen, dass die Eigenschaften nicht null sind.
Der Anrufer kann beispielsweise Folgendes tun:
var connection = new Connection
{
ServiceUrl=some_value,
//...
}
Meine Frage: Wie gehe ich mit solchen Fehlern in DTO-Klassen um, wenn der Nullfähigkeitskontext von C # 8 aktiviert ist?
Plain Old C# Object
. Nur ein Objekt wie jedes andere, ohne von einer speziellen Klasse zu erben. Ich vermute, Sie haben eine andere Frage. So erstellen Sie DTOs -Data Transfer Objects
This should be the responsibility of the one initializing the class to ensure that the properties are non-null
Die Klasse sollte immer in einem gültigen Zustand sein. Wenn diesnull
nicht zulässig ist, sollte die Eigenschaft niemals null sein. Vielleicht sollten Sie anstelle einer einfachen Zeichenfolge eine spezielle Klasse für die URL verwenden, die den WertNone
oder "Missing" haben kann, wie die Option-Klasse in F #. Mit C # 8 können Sie solche Klassen schreiben und sie mit Mustervergleich überprüfenpublic string ServiceUrl { get; set; } = default! ;
. Ich hoffe, dass Roslyn in Zukunft eine Möglichkeit hat, die späte Initialisierung außerhalb des Bereichs von ctor zu handhaben. Ich habe MayBe <T> (wie die Optionsklasse) verwendet, aber für den neuen Code in c # 8 auf nullable Reference Type umgestellt.Antworten:
Die nächste Lösung wird von EF Core & EF6 empfohlen, siehe
1) Durch Initialisieren mit
null!
mit verzeihendem Bediener2) Verwenden des Hintergrundfelds:
quelle
!
Operator nicht verwenden kann .Wenn es nicht nullbar ist, was kann der Compiler dann tun, wenn das Objekt initialisiert wird?
Der Standardwert der Zeichenfolge ist null
Sie müssen entweder einen Standardwert für die Zeichenfolge in der Deklaration zuweisen
public string ServiceUrl { get; set; } = String.Empty;
Oder initialisieren Sie den Wert im Standardkonstruktor, damit Sie die Warnung entfernen
Verwenden Sie den
!
Operator (den Sie nicht verwenden können)Machen Sie es nullbar, wie von robbpriestley erwähnt.
quelle
ServiceUrl'
kann nicht sein = String.Empty. Es gibt andere Eigenschaften von komplexem Typ, die nicht null sein können, daher habe ichdefault
Folgendes verwendet : 'public MyClass MyProperty {get; einstellen; } = Standard! 'um die Warnung zu stoppen. Diese Klasse (und andere) ist ein parameterloser Konstruktor und wurde kürzlich außerhalb des Bereichs von ctor initialisiert.Eine andere Sache, die in einigen Szenarien nützlich sein könnte:
Kann über dem Element oder dem gesamten Typ verwendet werden.
Eine weitere zu berücksichtigende Sache ist das Hinzufügen
#nullable disable
über der Datei, um die nullfähige Referenz für die gesamte Datei zu deaktivieren.quelle