Partilhar via


Como: Usando sistema autônomo difusão com segurança e for operadores (translation from VPE for Csharp Programming guia)

Como os objetos são polimórficos, é possível que uma variável de um tipo de classe base para guardar um tipo derivado.Para acessar o método do tipo derivado, é necessário converter o valor para tipo derivado.No entanto, para tentar uma simples efeito nesses casos cria o risco de gerar um InvalidCastException. É por isso translation from VPE for Csharp fornece o queé and sistema autônomo operadores.Você pode usar esses operadores para teste se uma conversão será bem-sucedida sem causar uma exceção seja lançada.Em geral, a as operador é mais eficiente porque, na verdade, retorna o valor de conversão se a conversão pode ser feita com êxito. The is operador retorna apenas um valor booliano. Ele pode ser usado, portanto, quando você apenas deseja determinar o tipo do objeto, mas não precisa lançá-lo realmente.

Exemplo

Os exemplos a seguir mostram como usar o is e as Digite operadores de conversão de uma referência para outro, sem o risco de gerar uma exceção. O exemplo também mostra como usar o as operador com tipos de valor nulo.

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

Consulte também

Referência

Tipos (guia de programação translation from VPE for Csharp)

Elenco e conversões de tipo (guia de programação translation from VPE for Csharp)

Tipos anuláveis (guia de programação C#)

Date

History

Motivo

Julho de 2008

Tópico adicional.

Correção de bug do conteúdo.