El operador ! de postfijo unario es el operador que permite los valores NULL o la supresión de valores NULL. En un contexto de anotación que acepta valores NULL habilitado, se usa el operador null-forgiving para suprimir todas las advertencias que aceptan valores NULL para la expresión anterior. El operador ! de prefijo unario es el operador lógico de negación. El operador que permite un valor NULL no tiene ningún efecto en tiempo de ejecución. Solo afecta al análisis de flujo estático del compilador al cambiar el estado NULL de la expresión. En tiempo de ejecución, la expresión x! se evalúa en el resultado de la expresión subyacente x.
Uno de los casos de uso del operador que permite un valor NULL es probar la lógica de validación de argumentos. Por ejemplo, considere la siguiente clase:
C#
#nullable enablepublicclassPerson
{
publicPerson(string name) => Name = name ?? thrownew ArgumentNullException(nameof(name));
publicstring Name { get; }
}
Con el marco de pruebas MSTest puede crear la prueba siguiente para la lógica de validación en el constructor:
C#
[TestMethod, ExpectedException(typeof(ArgumentNullException))]
publicvoidNullNameShouldThrowTest()
{
var person = new Person(null!);
}
Sin el operador que permite un valor NULL, el compilador genera la advertencia siguiente para el código anterior: Warning CS8625: Cannot convert null literal to non-nullable reference type. Al usar el operador que permite un valor NULL, se notifica al compilador que lo esperado es que se pase null y no se debe advertir al respecto.
También puede usar el operador que permite valores NULL cuando sepa a ciencia cierta que una expresión no puede ser null, pero el compilador no consigue reconocerlo. En el ejemplo siguiente, si el método IsValid devuelve true, su argumento no es null y puede desreferenciarlo de forma segura:
C#
publicstaticvoidMain()
{
Person? p = Find("John");
if (IsValid(p))
{
Console.WriteLine($"Found {p!.Name}");
}
}
publicstaticboolIsValid(Person? person)
=> person isnotnull && person.Name isnotnull;
Sin el operador que permite un valor NULL, el compilador genera la advertencia siguiente para el código p.Name: Warning CS8602: Dereference of a possibly null reference.
Si puede modificar el método IsValid, puede usar el atributo NotNullWhen para notificar al compilador que un argumento del método IsValid no puede ser null cuando el método devuelve true:
C#
publicstaticvoidMain()
{
Person? p = Find("John");
if (IsValid(p))
{
Console.WriteLine($"Found {p.Name}");
}
}
publicstaticboolIsValid([NotNullWhen(true)] Person? person)
=> person isnotnull && person.Name isnotnull;
En el ejemplo anterior, no es necesario usar el operador que permite un valor NULL porque el compilador tiene suficiente información para averiguar que p no puede ser null en la instrucción if. Para más información sobre los atributos que permiten proporcionar información adicional sobre el estado NULL de una variable, vea Actualización de las API con atributos para definir las expectativas NULL.
Eduki honen iturburua GitHub-en aurki daiteke, bertan arazoak eta aldaketak egiteko eskaerak sortu eta berrikus ditzakezu. Informazio gehiagorako, ikusi gure kolaboratzaileen gida.
.NET oharrak
.NET iturburu irekiko proiektu bat da. Hautatu esteka bat oharrak bidaltzeko:
Bat egin IAren soluzio eskalagarrien soluzioak sortzeko topaketa sortarekin, mundu errealaren erabilera-kasuetan oinarrituak, beste garatzaile eta aditu batzuekin.