C# Language como


Ejemplo

La palabra clave as es un operador similar a un reparto . Si una conversión no es posible, usar as produce null lugar de dar como resultado una excepción InvalidCastException .

expression as type es equivalente a expression is type ? (type)expression : (type)null con la advertencia de que, as solo es válido en las conversiones de referencia, las conversiones que admiten expression is type ? (type)expression : (type)null y las conversiones de boxeo. Las conversiones definidas por el usuario no son compatibles; en su lugar se debe usar un elenco regular.

Para la expansión anterior, el compilador genera código de tal manera que la expression solo se evaluará una vez y utilizará la comprobación de tipo dinámico único (a diferencia de los dos en el ejemplo anterior).

as puede ser útil cuando se espera que un argumento facilite varios tipos. Específicamente, se concede al usuario múltiples opciones - en lugar de comprobar todas las posibilidades con is antes de la colada, o simplemente la fundición y la captura de excepciones. Es una buena práctica usar 'como' al lanzar / verificar un objeto, lo que causará solo una penalización de desempaquetado. El uso is para verificar, luego el lanzamiento causará dos penalizaciones de desempaquetado.

Si se espera que un argumento sea una instancia de un tipo específico, se prefiere una conversión regular, ya que su propósito es más claro para el lector.

Debido a que una llamada a as puede producir null , siempre verifique el resultado para evitar una NullReferenceException .

Ejemplo de uso

object something = "Hello";
Console.WriteLine(something as string);        //Hello
Console.Writeline(something as Nullable<int>); //null
Console.WriteLine(something as int?);          //null

//This does NOT compile:
//destination type must be a reference type (or a nullable value type)
Console.WriteLine(something as int);

Demo en vivo en .NET Fiddle

Ejemplo equivalente sin usar as :

Console.WriteLine(something is string ? (string)something : (string)null);

Esto es útil cuando se reemplaza la función de Equals en clases personalizadas.

class MyCustomClass
{

    public override bool Equals(object obj)
    {
        MyCustomClass customObject = obj as MyCustomClass;

        // if it is null it may be really null
        // or it may be of a different type
        if (Object.ReferenceEquals(null, customObject))
        {
            // If it is null then it is not equal to this instance.
            return false;
        }

        // Other equality controls specific to class
    }

}