Mam DTO, który jest wypełniany przez czytanie z tabeli DynamoDB. Powiedzmy, że obecnie wygląda to tak:
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
}
Czy istnieją jakieś najlepsze praktyki dotyczące radzenia sobie z tym? Wolałbym unikać nieparametrycznego konstruktora, ponieważ źle działa on z ORM w zestawie Dynamo SDK (podobnie jak inne).
Wydaje mi się dziwne pisanie, public string Id { get; set; } = "";
ponieważ to się nigdy nie wydarzy, ponieważ Id
jest to PK i nigdy nie może być zerowe. Jaki byłby użytek, ""
gdyby tak się stało?
Więc jakaś najlepsza praktyka w tym zakresie?
- Czy powinienem zaznaczyć je wszystkie,
string?
aby powiedzieć, że mogą być zerowe, chociaż niektórzy nigdy nie powinni. - Powinienem zainicjować
Id
i zaName
pomocą,""
ponieważ nigdy nie powinny być zerowe, a to pokazuje zamiar, chociaż""
nigdy nie zostanie użyty. - Niektóre kombinacje powyższych
Uwaga: chodzi o typy zerowalne C # 8. Jeśli nie wiesz, co najlepiej, nie odpowiadaj.
c#
c#-8.0
non-nullable
nullable-reference-types
BritishDeveloper
źródło
źródło
#pragma warning disable CS8618
w górną część pliku.= ""
możesz użyć= null!
do zainicjowania właściwości, o której wiesz, że nigdy tak naprawdę nie będzienull
(gdy kompilator nie ma możliwości, aby to wiedzieć). Jeśli jestDescription
to zgodne z prawemnull
, należy je zadeklarowaćstring?
. Alternatywnie, jeśli sprawdzanie zerowości dla DTO jest bardziej uciążliwe niż pomoc, możesz po prostu owinąć ten typ w#nullable disable
/,#nullable restore
aby wyłączyć NRT tylko dla tego typu.Odpowiedzi:
Opcjonalnie możesz użyć
default
literału w połączeniu znull forgiving operator
Ponieważ Twoje DTO jest zapełniane z DynamoDB, możesz użyć
MaybeNull/NotNull
atrybutów warunków dodatkowych, aby kontrolować nullabilityMaybeNull
Zwracana wartość zerowa może być zerowa.NotNull
Zwracana zerowa wartość nigdy nie będzie pusta.Ale te atrybuty wpływają tylko na analizę zerowalną dla dzwoniących członków, którzy są z nimi opatrzeni adnotacjami. Zazwyczaj te atrybuty stosuje się do zwrotów metod, właściwości i modułów pobierających indeksatory.
Możesz więc rozważyć wszystkie swoje właściwości, które nie mają wartości zerowej, i udekoruj je
MaybeNull
atrybutem, wskazując, że zwracają one możliwąnull
wartośćPoniższy przykład pokazuje użycie zaktualizowanej
Item
klasy. Jak widać, druga linia nie wyświetla ostrzeżenia, ale trzecia takLub możesz
NoNull
ustawić wszystkie właściwości na wartości zerowe i użyć, aby wskazać, że zwracana wartość nie może byćnull
(Id
na przykład)Ostrzeżenie będzie takie samo jak w poprzednim przykładzie.
Istnieją również
AllowNull/DisallowNull
atrybuty warunków wstępnych dla parametrów wejściowych, właściwości i ustawiaczy indeksujących, działających w podobny sposób.AllowNull
Niedopuszczalny argument wejściowy może mieć wartość NULL.DisallowNull
Argument wejściowy o wartości zerowej nigdy nie powinien mieć wartości NULL.Nie sądzę, żeby ci to pomogło, ponieważ twoja klasa jest zapełniona z bazy danych, ale możesz ich użyć do kontrolowania zerowania właściwości ustawiających właściwości, tak jak dla pierwszej opcji
I po drugie
Niektóre pomocne szczegóły i przykłady postów / warunków wstępnych można znaleźć w tym artykule na blogu
źródło
Odpowiedzią podręcznika w tym scenariuszu jest użycie
string?
dla twojejId
nieruchomości, ale także udekorowanie jej[NotNull]
atrybutem:Co się tu właściwie dzieje?
string?
typ zwracany uniemożliwia kompilatorowi ostrzeżenie, że właściwość nie jest zainicjowana podczas budowy i dlatego domyślnie jest ustawiona nanull
.[NotNull]
atrybut zapobiega ostrzeżeniu podczas przypisywania właściwości do zmiennej, która nie ma wartości zerowej lub próby jej wyrejestrowania, ponieważ informujesz analizę statycznego przepływu kompilatora, że w praktyce ta właściwość nigdy nie będzienull
.Aby pomóc Ci utrzymać to zobowiązanie, możesz dodatkowo dodać adnotację do właściwości za pomocą
[DisallowNull]
atrybutu:Może to nie być istotne w twoim przypadku, ponieważ wartości są przypisywane za pośrednictwem bazy danych, ale ten
[DisallowNull]
atrybut wyświetli ostrzeżenie, jeśli kiedykolwiek spróbujesz przypisaćnull
(zdolną) wartość doId
, nawet jeśli typ zwracany pozwala inaczej zero . W tym względzieId
będzie działać dokładnie jakstring
w miarę statycznej analizy przepływowej C # 's jest zaniepokojony, a także pozwalając wartość pozostać niezainicjowanymi między budową obiektu i ludności nieruchomości.źródło
String jest typem referencyjnym i zawsze ma wartość null, nie musisz robić nic specjalnego. Możesz mieć problemy tylko później, jeśli chcesz zmapować ten typ obiektu na inny, ale możesz sobie z tym poradzić później.
źródło