Porady: bezpieczne rzutowanie za pomocą operatorów as i is (Przewodnik programowania w języku C#)

Ponieważ obiekty są polimorficzna, jest możliwe dla zmiennej typu klasy podstawowej do przechowywania typu pochodnego.Do dostępu typu pochodnego metody, jest niezbędne do oddania wartości powrotem do typu pochodnego.Jednak próba prosty oddanych w tych przypadkach stwarza ryzyko rzuca InvalidCastException.Oznacza to dlaczego C# zawiera jest i jako podmiotów gospodarczych.Aby sprawdzić, czy rzutowania kończy się pomyślnie, bez powodowania być zgłoszony wyjątek, można użyć tych operatorów.Ogólnie rzecz biorąc as operator jest bardziej efektywne, ponieważ faktycznie zwraca wartość rzutowania, jeśli rzutowania może się pomyślnie.is Operator zwraca tylko wartość logiczna.Można zatem używane, kiedy tylko chcesz określić typ obiektu ale nie jest faktycznie rzutować go.

Przykład

Następujące przykłady przedstawiają metody korzystania is i as podmiotów do oddania z odwołania do jednego typu do drugiego bez ryzyka zgłaszanie wyjątku.W przykładzie pokazano również jak używać as operatora z typów wartości NULL.

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

Zobacz też

Informacje

Typy (Przewodnik programowania w języku C#)

Rzutowanie i konwersje typów (Przewodnik programowania w języku C#)

Typy dopuszczające wartości zerowe (Przewodnik programowania w języku C#)