Eu tenho um DTO que é preenchido pela leitura de uma tabela do DynamoDB. Diga que parece com isso atualmente:
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 alguma prática recomendada para lidar com isso? Prefiro evitar um construtor sem parâmetros, pois isso é ruim com o ORM no Dynamo SDK (assim como com outros).
Parece-me estranho escrever public string Id { get; set; } = "";
porque isso nunca acontecerá, pois Id
é um PK e nunca pode ser nulo. De que serviria ""
mesmo que de alguma maneira?
Então, alguma prática recomendada sobre isso?
- Devo marcar todos eles
string?
para dizer que podem ser nulos, embora alguns nunca devam ser? - Devo inicializar
Id
eName
com,""
porque eles nunca devem ser nulos e isso mostra a intenção, mesmo que""
nunca fosse usada. - Alguma combinação de acima
Observe: trata-se de tipos de referência anuláveis em C # 8 Se você não souber o que é melhor, não responda.
c#
c#-8.0
non-nullable
nullable-reference-types
BritishDeveloper
fonte
fonte
#pragma warning disable CS8618
na parte superior do arquivo.= ""
, você pode= null!
inicializar uma propriedade que você sabe que nunca será efetivamentenull
(quando o compilador não tem como saber disso). SeDescription
legalmente pode sernull
, deve ser declarado astring?
. Como alternativa, se a verificação de nulidade do DTO for mais incômoda do que ajuda, você pode simplesmente envolver o tipo#nullable disable
/#nullable restore
desativar os NRTs somente para esse tipo.Respostas:
Como opção, você pode usar o
default
literal em combinação com onull forgiving operator
Como seu DTO é preenchido no DynamoDB, você pode usar
MaybeNull/NotNull
atributos pós-condição para controlar a nulidadeMaybeNull
Um valor de retorno não anulável pode ser nulo.NotNull
Um valor de retorno anulável nunca será nulo.Mas esses atributos afetam apenas a análise anulável para os chamadores dos membros que são anotados com eles. Normalmente, você aplica esses atributos aos retornos de métodos, propriedades e getters de indexadores.
Portanto, você pode considerar todas as suas propriedades não anuláveis e decorá-las com
MaybeNull
atributo, indicando que elas retornam umnull
valor possívelO exemplo a seguir mostra o uso da
Item
classe atualizada . Como você pode ver, a segunda linha não mostra aviso, mas a terceiraOu você pode tornar todas as propriedades anuláveis e usar
NoNull
para indicar que o valor de retorno não pode sernull
(Id
por exemplo)O aviso será o mesmo com o exemplo anterior.
Também existem
AllowNull/DisallowNull
atributos de pré-condição para parâmetros de entrada, propriedades e configuradores de indexadores, trabalhando da mesma maneira.AllowNull
Um argumento de entrada não anulável pode ser nulo.DisallowNull
Um argumento de entrada anulável nunca deve ser nulo.Eu não acho que isso irá ajudá-lo, já que sua classe é preenchida a partir do banco de dados, mas você pode usá-los para controlar a nulidade dos configuradores de propriedades, como este para a primeira opção
E para o segundo
Alguns detalhes e exemplos úteis de post / pré-condições podem ser encontrados neste artigo do devblog
fonte
A resposta do livro neste cenário é usar a
string?
para suaId
propriedade, mas também decorá-la com o[NotNull]
atributo:Então, o que exatamente está acontecendo aqui?
string?
tipo de retorno impede o compilador de avisando que a propriedade é inicializado durante a construção e, assim, o padrão paranull
.[NotNull]
atributo evita um aviso ao atribuir a propriedade a uma variável não anulável ou ao tentar desreferenciá-la, pois você está informando à análise de fluxo estático do compilador que, na prática , essa propriedade nunca seránull
.A fim de ajudar a manter esse compromisso, você pode também querer anotar a propriedade com o
[DisallowNull]
atributo:Isso pode não ser relevante no seu caso, uma vez que os valores estão sendo atribuídos por meio do banco de dados, mas o
[DisallowNull]
atributo emitirá um aviso se você tentar atribuir umnull
valor (capaz)Id
, mesmo que o tipo de retorno permita que ele seja nulo . Nesse sentido,Id
agiria exatamente como a nostring
que diz respeito à análise de fluxo estático do C #, além de permitir que o valor permanecesse não inicializado entre a construção do objeto e a população da propriedade.fonte
String é um tipo de referência e sempre anulável, você não precisa fazer nada de especial. Você poderá ter problemas apenas mais tarde se desejar mapear esse tipo de objeto para outro, mas poderá lidar com isso mais tarde.
fonte