¿Que significa?

36

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();
   }
}
evan
fuente

Respuestas:

28

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 objectcheque 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 switchexpresiones.

Daniel A. White
fuente
1
¿Qué significa objeto vacío en este caso? cadena vacía, espacio en blanco?
OlegI
3
@OlegI no, no lo es. sDefinitivamente no es nulo. is {}es la abreviatura de is objecty las cadenas se pueden convertir en objeto.
Panagiotis Kanavos
66
@OlegI ¿cómo es eso? Es una referencia válida por lo que coincide.
Daniel A. White
3
Es un nuevo mundo en el que estructuras pueden ser nula y referencias no pueden ser nulos, los estados de conmutación se invierten y diversos !, !!, ?y ??antes y después de propiedades significan cosas diferentes. ¿Cuándo será el azúcar sintáctico de gama alta?
ja72
3
¿Es lo mismo que value != null?
ca9163d9
7

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 BadObjectRequestResultes 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.

Equipo
fuente
En ese caso uno debería usar is object invalid, nois {} invalid
Panagiotis Kanavos
1
@PanagiotisKanavos que no funcionaría en este caso porque IActionResultse requiere un retorno de (bueno, técnicamente Task<IActionResult>). Si seguimos su estilo, el ifresultado invalidserá el mismo, pero será un resultado objectque no se compilará.
Kit
0

Creo que es para verificar si el valor es un objeto vacío

Nehemie
fuente