Tengo un DTO que se completa leyendo desde una tabla DynamoDB. Digamos que se ve así actualmente:
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 alguna práctica recomendada para hacer frente a esto? Prefiero evitar un constructor sin parámetros ya que eso juega mal con el ORM en el SDK de Dynamo (así como otros).
Me parece extraño escribir public string Id { get; set; } = "";
porque esto nunca sucederá ya que Id
es un PK y nunca puede ser nulo. ¿Qué uso sería ""
incluso si de alguna manera lo hiciera?
Entonces, ¿alguna mejor práctica en esto?
- ¿Debo marcarlos a todos
string?
para decir que pueden ser nulos, aunque algunos nunca deberían serlo? - Debería inicializar
Id
yName
con""
porque nunca deberían ser nulos y esto muestra la intención a pesar de""
que nunca se usaría. - Alguna combinación de arriba
Tenga en cuenta: se trata de los tipos de referencia anulables C # 8. Si no sabe cuáles son los mejores, no responda.
c#
c#-8.0
non-nullable
nullable-reference-types
Desarrollador Británico
fuente
fuente
#pragma warning disable CS8618
en la parte superior del archivo.= ""
eso, puede usar= null!
para inicializar una propiedad que sabe que nunca será efectivanull
(cuando el compilador no tiene forma de saberlo). SiDescription
puede ser legalmentenull
, debe declararse astring?
. Alternativamente, si la comprobación de nulabilidad para el DTO es más molesta que ayuda, simplemente puede ajustar el tipo#nullable disable
/#nullable restore
desactivar los NRT solo para este tipo.Respuestas:
Como opción, puede usar el
default
literal en combinación con elnull forgiving operator
Dado que su DTO se rellena desde DynamoDB, puede usar
MaybeNull/NotNull
atributos posteriores a la condición para controlar la nulabilidadMaybeNull
Un valor de retorno no anulable puede ser nulo.NotNull
Un valor de retorno anulable nunca será nulo.Pero estos atributos solo afectan el análisis anulable para los llamantes de los miembros que están anotados con ellos. Por lo general, aplica estos atributos a retornos de métodos, propiedades e indexadores getters.
Por lo tanto, puede considerar todas sus propiedades no anulables y decorarlas con un
MaybeNull
atributo, lo que indica que devuelven unnull
valor posibleEl siguiente ejemplo muestra el uso de la
Item
clase actualizada . Como puede ver, la segunda línea no muestra advertencia, pero la tercera síO puede hacer que todas las propiedades sean anulables y usar
NoNull
para indicar que el valor de retorno no puede sernull
(Id
por ejemplo)La advertencia será la misma con el ejemplo anterior.
También hay
AllowNull/DisallowNull
atributos de precondición para parámetros de entrada, propiedades y definidores de indexadores, que funcionan de manera similar.AllowNull
Un argumento de entrada no anulable puede ser nulo.DisallowNull
Un argumento de entrada anulable nunca debe ser nulo.No creo que le ayude, ya que su clase se llena desde la base de datos, pero puede usarlos para controlar la nulabilidad de los establecedores de propiedades, como este para la primera opción
Y para el segundo
Algunos detalles útiles y ejemplos de post / condiciones previas se pueden encontrar en este artículo de devblog
fuente
La respuesta del libro de texto en este escenario es usar un
string?
para suId
propiedad, pero también decorarlo con el[NotNull]
atributo:Entonces, ¿qué está pasando exactamente aquí?
string?
tipo de retorno impide que el compilador de aviso de que la propiedad no está inicializado durante la construcción y por lo tanto será por defecto anull
.[NotNull]
atributo evita una advertencia al asignar la propiedad a una variable no anulable o al intentar desreferenciarla, ya que está informando al análisis de flujo estático del compilador que, en la práctica , esta propiedad nunca lo seránull
.A fin de ayudar a mantener ese compromiso, es posible que además desee para anotar la propiedad con el
[DisallowNull]
atributo:Esto puede no ser relevante en su caso, ya que los valores se asignan a través de la base de datos, pero el
[DisallowNull]
atributo le dará una advertencia si alguna vez intenta asignar unnull
valor (capaz) aId
, aunque el tipo de retorno de lo contrario permita que sea nula . A este respecto,Id
actuaría exactamente como unastring
medida de lo análisis de flujo estático C # 's se refiere, mientras que también permite que el valor de permanecer sin inicializar entre la construcción del objeto y la población de la propiedad.fuente
La cadena es un tipo de referencia y siempre anulable, no necesita hacer nada especial. Podría tener problemas solo más tarde si desea asignar este tipo de objeto a otro, pero puede manejarlo más tarde.
fuente