Gewusst wie: Sichere Umwandlung mit den Operatoren "as" und "is" (C#-Programmierhandbuch)How to: Safely Cast by Using as and is Operators (C# Programming Guide)

Da Objekte polymorph sind, ist es möglich, dass eine Variable eines Basisklassentyps einen abgeleiteten Typ enthalten kann.Because objects are polymorphic, it is possible for a variable of a base class type to hold a derived type. Um auf die Methode des abgeleiteten Typ zuzugreifen, ist es erforderlich, dass Sie den Wert wieder in den abgeleiteten Typ umwandeln.To access the derived type's method, it is necessary to cast the value back to the derived type. Wenn Sie allerdings in diesen Fällen eine Umwandlung durchführen, besteht das Risiko, dass Sie eine InvalidCastException auslösen.However, to attempt a simple cast in these cases creates the risk of throwing an InvalidCastException. Deshalb bietet C# die Operatoren is und as.That is why C# provides the is and as operators. Sie können diese Operatoren verwenden, um zu prüfen, ob eine Umwandlung erfolgreich durchgeführt werden kann, ohne dass eine Ausnahme ausgelöst wird.You can use these operators to test whether a cast will succeed without causing an exception to be thrown. Für gewöhnlich ist der as-Operator effizienter, da er den Umwandlungswert zurückgibt, wenn die Umwandlung erfolgreich durchgeführt werden kann.In general, the as operator is more efficient because it actually returns the cast value if the cast can be made successfully. Der is-Operator gibt einen booleschen Wert zurück.The is operator returns only a Boolean value. Er kann deshalb verwendet werden, wenn Sie nur den Typ eines Objekts bestimmen wollen, ihn aber nicht tatsächlich umwandeln müssen.It can therefore be used when you just want to determine an object's type but do not have to actually cast it.

BeispielExample

Im folgenden Beispiel wird gezeigt, wie Sie die Operatoren is und as verwenden können, um einen Verweistyp in einen anderen umzuwandeln, ohne dass das Risiko besteht, dass eine Ausnahme ausgelöst wird.The following examples show how to use the is and as operators to cast from one reference type to another without the risk of throwing an exception. In diesem Beispiel wird auch gezeigt, wie Sie den as-Operator mit einem auf NULL festlegbaren Werttyp verwenden können.The example also shows how to use the as operator with nullable value types.

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

Siehe auchSee Also

TypenTypes
Umwandlung und TypkonvertierungenCasting and Type Conversions
Typen mit NullwertNullable Types