Respuestas:
Eso es solo el patrón de propiedad vacío en C # 8, lo que significa que el valor no null
. Coincide con cualquier tipo de valor o tipo de referencia. Como señala Panagiotis Kanavos en los comentarios, esto es equivalente al buen value is object
cheque antiguo que ha estado en C # durante mucho tiempo.
En general, si tuviera que especificar una propiedad, entonces coincidiría o no. Este ejemplo esotérico ilustra que:
if (value is { Length: 2 })
{
// matches any object that isn't `null` and has a property set to a length of 2
}
Los patrones de propiedad funcionan mejor y son más claros cuando se comparan con otros patrones en casos como las switch
expresiones.
s
Definitivamente no es nulo. is {}
es la abreviatura de is object
y las cadenas se pueden convertir en objeto.
!
, !!
, ?
y ??
antes y después de propiedades significan cosas diferentes. ¿Cuándo será el azúcar sintáctico de gama alta?
value != null
?
Si bien la respuesta de Daniel es correcta, creo que podría ser útil agregar algún contexto sobre por qué puede ver el patrón de propiedad vacío en uso. Considere este método de controlador de ejemplo que necesita alguna validación:
public async Task<IActionResult> Update(string id, ...)
{
if (ValidateId(id) is { } invalid)
return invalid;
...
}
En lo anterior, ValidateId()
podría devolver nulo o una instancia de BadObjectRequestResult
. Si se devuelve el primero, la validación es exitosa y pasa al resto del cuerpo de Update
. Si se devuelve este último, is {}
es verdadero (es decir, por supuesto, una instancia de BadObjectRequestResult
es un object
), y la validación falla.
Muy bien, de esto también hemos proporcionado un nombre de variable invalid
, que podemos devolver de inmediato. Sin eso, necesitaríamos un código un poco más detallado.
public async Task<IActionResult> Update(string id, ...)
{
var invalid = ValidateId(id);
if (invalid != null)
return invalid;
...
}
Si uno es más legible o el otro depende del lector, acabo de presentar una forma en que se puede usar el patrón de propiedad vacío.
is object invalid
, nois {} invalid
IActionResult
se requiere un retorno de (bueno, técnicamente Task<IActionResult>
). Si seguimos su estilo, el if
resultado invalid
será el mismo, pero será un resultado object
que no se compilará.