J'ai un DTO qui est rempli en lisant une table DynamoDB. Disons que cela ressemble à ceci actuellement:
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
}
Existe-t-il des meilleures pratiques en cours d'élaboration pour y faire face? Je préfère éviter un constructeur sans paramètre car cela joue mal avec l'ORM dans le SDK Dynamo (ainsi que d'autres).
Cela me semble étrange d'écrire public string Id { get; set; } = "";
car cela ne se produira jamais car il Id
s'agit d'un PK et ne peut jamais être nul. Quelle serait l'utilité ""
même si elle le faisait de toute façon?
Alors, quelle est la meilleure pratique à ce sujet?
- Dois-je les marquer tous
string?
pour dire qu'ils peuvent être nuls même si certains ne devraient jamais l'être. - Dois-je initialiser
Id
etName
avec""
car ils ne doivent jamais être nuls et cela montre l'intention même si""
elle ne sera jamais utilisée. - Une combinaison de ce qui précède
Veuillez noter: il s'agit de types de référence annulables C # 8 Si vous ne savez pas ce qu'il vaut mieux, ne répondez pas.
c#
c#-8.0
non-nullable
nullable-reference-types
BritishDeveloper
la source
la source
#pragma warning disable CS8618
en haut du fichier.= ""
, vous pouvez utiliser= null!
pour initialiser une propriété que vous savez ne sera jamais efficacenull
(lorsque le compilateur n'a aucun moyen de le savoir). Si celaDescription
peut être légalement possiblenull
, il doit être déclaré astring?
. Alternativement, si la vérification de la nullité pour le DTO est plus gênante que l'aide, vous pouvez simplement envelopper le type dans#nullable disable
/#nullable restore
pour désactiver les NRT pour ce type uniquement.Réponses:
En option, vous pouvez utiliser le
default
littéral en combinaison avec lenull forgiving operator
Étant donné que votre DTO est rempli à partir de DynamoDB, vous pouvez utiliser des
MaybeNull/NotNull
attributs de postcondition pour contrôler la nullitéMaybeNull
Une valeur de retour non nullable peut être nulle.NotNull
Une valeur de retour nullable ne sera jamais nulle.Mais ces attributs n'affectent que l'analyse annulable pour les appelants des membres qui sont annotés avec eux. En règle générale, vous appliquez ces attributs aux retours de méthode, aux propriétés et aux indexeurs.
Ainsi, vous pouvez considérer toutes vos propriétés comme non nulles et les décorer avec un
MaybeNull
attribut, en indiquant qu'elles renvoient unenull
valeur possibleL'exemple suivant montre l'utilisation de la
Item
classe mise à jour . Comme vous pouvez le voir, la deuxième ligne n'affiche pas d'avertissement, mais la troisièmeOu vous pouvez rendre toutes les propriétés nullables et utiliser
NoNull
pour indiquer que la valeur de retour ne peut pas êtrenull
(Id
par exemple)L'avertissement sera le même que dans l'exemple précédent.
Il existe également des
AllowNull/DisallowNull
attributs de condition préalable pour les paramètres d'entrée, les propriétés et les indicateurs d'indexation, fonctionnant de la même manière.AllowNull
Un argument d'entrée non nullable peut être nul.DisallowNull
Un argument d'entrée nullable ne doit jamais être null.Je ne pense pas que cela vous aidera, car votre classe est remplie à partir de la base de données, mais vous pouvez les utiliser pour contrôler la nullité des setters de propriétés, comme ceci pour la première option
Et pour le deuxième
Quelques détails utiles et exemples de post / conditions préalables peuvent être trouvés dans cet article de devblog
la source
La réponse du manuel dans ce scénario est d'utiliser un
string?
pour votreId
propriété, mais aussi de le décorer avec l'[NotNull]
attribut:Alors, que se passe-t-il exactement ici?
string?
type de retour empêche le compilateur de vous avertir que la propriété est non initialisée lors de la construction et donc par défaut ànull
.[NotNull]
attribut empêche un avertissement lors de l'attribution de la propriété à une variable non nullable ou de la tentative de déréférencement, car vous informez l'analyse de flux statique du compilateur que, dans la pratique , cette propriété ne le sera jamaisnull
.Afin de vous aider à maintenir cet engagement, vous pouvez en outre souhaiter annoter la propriété avec l'
[DisallowNull]
attribut:Cela peut ne pas être pertinent dans votre cas, car les valeurs sont attribuées via la base de données, mais l'
[DisallowNull]
attribut vous avertira si vous essayez d'attribuer unenull
valeur (capable) àId
, même si le type de retour permet autrement de le faire. null . À cet égard,Id
agirait exactement comme unstring
en ce qui concerne l' analyse de flux statique de C #, tout en permettant également à la valeur de rester non initialisée entre la construction de l'objet et la population de la propriété.la source
La chaîne est un type de référence et toujours nullable, vous n'avez rien à faire de spécial. Vous pourriez avoir des problèmes uniquement plus tard si vous souhaitez mapper ce type d'objet à un autre, mais vous pouvez gérer cela plus tard.
la source