A veces veo el siguiente código, y no tengo idea de lo que la expresión realmente está probando.
public static void Something(string[] value)
{
if (value is { })
{
DoSomethingElse();
}
}
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 deis 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:
En lo anterior,
ValidateId()
podría devolver nulo o una instancia deBadObjectRequestResult
. Si se devuelve el primero, la validación es exitosa y pasa al resto del cuerpo deUpdate
. Si se devuelve este último,is {}
es verdadero (es decir, por supuesto, una instancia deBadObjectRequestResult
es unobject
), 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.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.
fuente
is object invalid
, nois {} invalid
IActionResult
se requiere un retorno de (bueno, técnicamenteTask<IActionResult>
). Si seguimos su estilo, elif
resultadoinvalid
será el mismo, pero será un resultadoobject
que no se compilará.Creo que es para verificar si el valor es un objeto vacío
fuente