Aktywowałem tę funkcję w projekcie posiadającym klasy obiektów przesyłania danych (DTO), jak podano poniżej:
public class Connection
{
public string ServiceUrl { get; set; }
public string? UserName { get; set; }
public string? Password { get; set; }
//... others
}
Ale dostaję błąd:
CS8618
: Właściwość niezerowa „ServiceUrl” jest niezainicjowana. Rozważ zadeklarowanie właściwości jako zerowalną.
To jest klasa DTO, więc nie inicjuję właściwości. Będzie to odpowiedzialnością kodu inicjującego klasę, aby upewnić się, że właściwości nie mają wartości null.
Na przykład osoba dzwoniąca może:
var connection = new Connection
{
ServiceUrl=some_value,
//...
}
Moje pytanie: Jak radzić sobie z takimi błędami w klasach DTO, gdy włączony jest kontekst dopuszczalności C # 8?
Plain Old C# Object
. Po prostu obiekt jak każdy inny, bez dziedziczenia po specjalnej klasie. Podejrzewam, że masz inne pytanie. Jak tworzyć DTO -Data Transfer Objects
This should be the responsibility of the one initializing the class to ensure that the properties are non-null
klasa powinna być zawsze w poprawnym stanie. Jeślinull
nie jest dozwolone, właściwość nigdy nie powinna być pusta. Być może zamiast podstawowego ciągu znaków powinieneś użyć specjalnej klasy dla adresu URL, która może mieć wartość lubNone
`Missing`, jak klasa Option w F #. C # 8 pozwala pisać takie klasy i sprawdzać je za pomocą dopasowania wzorcapublic string ServiceUrl { get; set; } = default! ;
. Mam nadzieję, że Roslyn może mieć w przyszłości sposób obsługi późnej inicjalizacji poza zakresem ctor. Używałem MayBe <T> (podobnie jak klasa Option), ale dla nowego kodu przestawiłem się na zerowy typ referencyjny w c # 8.Odpowiedzi:
Kolejne rozwiązanie jest zalecane przez EF Core i EF6 patrz
1) Poprzez zainicjowanie za
null!
pomocą wybaczającego operatora2) Za pomocą pola podkładowego:
źródło
!
operatora.Jeśli nie ma wartości zerowej, co może zrobić kompilator po zainicjowaniu obiektu?
Domyślna wartość łańcucha to null, więc będziesz
albo trzeba przypisać domyślną wartość ciągu do deklaracji
public string ServiceUrl { get; set; } = String.Empty;
Lub zainicjuj wartość w domyślnym konstruktorze, aby pozbyć się ostrzeżenia
Użyj
!
operatora (którego nie możesz użyć)Uczyń go zerowalnym, jak wspomniał Robbpriestley.
źródło
ServiceUrl'
nie może być = String.Empty. Istnieją inne właściwości typu złożonego, które nie mogą mieć wartości NULL, więc użyłemdefault
: „public MyClass MyProperty {get; zestaw; } = domyślnie! „aby zatrzymać ostrzeżenie. Ta klasa (i inne) jest konstruktorem bez parametrów i została ostatnio zainicjowana poza zakresem ctor.Kolejna rzecz, która może się przydać w niektórych scenariuszach:
Może być stosowany na elemencie członkowskim lub całym typie.
Jeszcze inną rzeczą do rozważenia jest dodanie
#nullable disable
na wierzchu pliku, aby wyłączyć odwołanie zerowalne dla całego pliku.źródło