Partager via


Comment : effectuer sans risque un cast à l'aide des opérateurs as et is (Guide de programmation C#)

Parce que les objets sont polymorphes, la variable d'un type de classe de base peut contenir un type dérivé.Pour accéder à la méthode du type dérivé, il est nécessaire de caster la valeur pour la reconvertir en type dérivé.Néanmoins, toute tentative de simple cast risque, dans de tels cas, de provoquer la levée d'une InvalidCastException.C'est pourquoi C# fournit les opérateurs is et as.Vous pouvez utiliser ces opérateurs pour vérifier qu'un cast réussit sans provoquer la levée d'une exception.En général, l'opérateur as est plus efficace parce qu'il retourne réellement la valeur de cast si le cast aboutit.L'opérateur is retourne seulement une valeur booléenne.Il peut être utilisé par conséquent lorsque vous souhaitez juste déterminer le type d'un objet, mais n'avez pas réellement à effectuer de cast.

Exemple

Les exemples suivants indiquent comment utiliser les opérateurs is et as pour effectuer un cast d'un type référence en un autre sans risquer de lever une exception.Ils montrent également comment utiliser l'opérateur as avec des types valeur Nullable.

class SafeCasting
{
    class Animal
    {
        public void Eat() { Console.WriteLine("Eating."); }
        public override string ToString()
        {
            return "I am an animal.";
        }
    }
    class Mammal : Animal { }
    class Giraffe : Mammal { }

    class SuperNova { }

    static void Main()
    {
        SafeCasting app = new SafeCasting();

        // Use the is operator to verify the type.
        // before performing a cast.
        Giraffe g = new Giraffe();
        app.UseIsOperator(g);

        // Use the as operator and test for null
        // before referencing the variable.
        app.UseAsOperator(g);

        // Use the as operator to test
        // an incompatible type.
        SuperNova sn = new SuperNova();
        app.UseAsOperator(sn);

        // Use the as operator with a value type.
        // Note the implicit conversion to int? in 
        // the method body.
        int i = 5;
        app.UseAsWithNullable(i);


        double d = 9.78654;
        app.UseAsWithNullable(d);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }

    void UseIsOperator(Animal a)
    {
        if (a is Mammal)
        {
            Mammal m = (Mammal)a;
            m.Eat();
        }
    }

    void UseAsOperator(object o)
    {
        Mammal m = o as Mammal;
        if (m != null)
        {
            Console.WriteLine(m.ToString());
        }
        else
        {
            Console.WriteLine("{0} is not a Mammal", o.GetType().Name);
        }
    }

    void UseAsWithNullable(System.ValueType val)
    {
        int? j = val as int?;
        if (j != null)
        {
            Console.WriteLine(j);
        }
        else
        {
            Console.WriteLine("Could not convert " + val.ToString());
        }
    }
}

Voir aussi

Référence

Types (Guide de programmation C#)

Cast et conversions de types (Guide de programmation C#)

Types Nullable (Guide de programmation C#)