Il modo migliore per verificare tipi specifici

2

Normalmente lo faccio:

if (Animal is Dog)
{
    Doc d = (Dog)Animal;
    // d. etc..
} 
else if (Animal is Cat) 
{
    Cat c = (Cat)Animal;
    // c. ....
}

Questo è un buon modo o ci sono modi migliori per implementare questo codice sopra (performance, ...)?

Dovrebbe essere così?:

Dog d = Animal as Dog;

if (d != null;)
{
    // d. etc..
} 
else if (Animal is Cat) 
{
    Cat c = (Cat)Animal;
    // c. ....
}

O forse così?:

Dog d = Animal as Dog;
Cat c;

if (d != null;)
{
    // d. etc..
} 
else if ((c = Animal as Cat) != null) 
{
    // c. ....
}

O forse qualcos'altro?

    
posta juFo 14.06.2013 - 11:03
fonte

3 risposte

26

Idealmente, dovresti mirare solo a:

Animal.DoWhateverYouNeedDone();

Cioè, implementa il comportamento polimorfico (se si tratta di un cane, fai un cane, se è un gatto, fai un gatto, ecc.) nelle classi stesse. Quindi, invece di questo:

if (Animal is Dog) {
    var d = Animal as Dog;
    d.Bark();
}
if (Animal is Cat) {
    var c = Animal as Cat;
    c.Meow();
}

Fai questo:

Animal.Speak();

// where:

public class Dog: Animal {
    public void Speak() {
        this.Bark();
    }
    // ---- snip -----
}
public class Cat: Animal {
    public void Speak() {
        this.Meow();
    }
    // ---- snip -----
}
    
risposta data 14.06.2013 - 11:31
fonte
8

La risposta di tdammers è il modo corretto per farlo e il 99% delle volte dovresti farlo in quel modo.

molto raramente ci possono essere situazioni in cui non vuoi farlo in quel modo. In queste circostanze utilizzerei l'approccio 'as e check for null'. Infatti FxCop ti avviserà in realtà che stai trasmettendo due volte (una volta con is e una volta con un effettivo cast) nel tuo primo approccio

    
risposta data 14.06.2013 - 12:19
fonte
0

Dipende piuttosto da quale comportamento stai cercando di accedere. Esporre all'esempio precedente:

        if (Animal is Dog)
        {
            Dog d = (Dog)Animal;
            d.BuryBone();
        }
        else if (Animal is Cat)
        {
            Cat c = (Cat)Animal;
            c.DrinkSaucerOfMilk();
        }

Questo è perfetto se stai cercando un comportamento specifico per cani o gatti specifici . Altrimenti se vuoi usare i metodi più generali della classe base:

Animal.EatFood();

O se hai definito un'interfaccia:

IAnimal tiddles = new Cat();           
IAnimal rex = new Dog();

tiddles.EatFood();
rex.EatFood();
    
risposta data 14.06.2013 - 16:39
fonte

Leggi altre domande sui tag