¿Cuál es el propósito del signo de interrogación después del tipo de parámetro que es un tipo de referencia?
por ejemplo, uno de los constructores de OverflowException contiene una string? y Exception? parámetros:
public OverflowException(string? message, Exception? innerException);No veo el punto de marcarlos como anulables, ya que no son tipos de valor, por lo que son anulables de forma predeterminada.
¿Cual es el punto? ¿Significa algo diferente?
En C# 8.0, se introdujeron tipos de referencia que aceptan valores NULL ; esto le permite marcar tipos de referencia como que aceptan valores NULL agregando ? al nombre del tipo.
En el análisis de estado nulo , el código se verifica estáticamente para realizar un seguimiento del estado nulo de las referencias. Este análisis puede resultar en uno de los 2 estados siguientes:
not-null - la variable tiene un valor no nulo
quizás-null - la variable puede ser nula o no nula; el analizador no puede determinar con certeza
Esto es útil ya que ayuda al compilador a proporcionar advertencias para ayudarlo a escribir código menos propenso a NullReferenceExceptions y más consumible por otras API .
Por ejemplo, el compilador emitirá una advertencia para lo siguiente.
#nullable enable ... string message = null; // Warning - CS8602 Dereference of a possibly null reference Console.WriteLine(message.Length); Esto se debe a que, dado message se estableció en nulo, su estado se rastreó como quizás nulo . Esto arroja una advertencia para alertarlo en caso de que esté intentando acceder a las propiedades de un objeto nulo. Y sí, lo eres.
Aquí hay un ejemplo diferente:
#nullable enable ... string message = "The quick brown fox jumps over the lazy dog"; // No warning Console.WriteLine(message.Length); Dado que se sabe que el message no es nulo , su estado se establece en no nulo . El compilador no generará una advertencia ya que sabe que puede desreferenciar la variable de manera segura. Definitivamente no es nulo.
Alternativamente, también puede decidir decirle al mundo que algunas variables pueden ser nulas :)