Cela dépend de ce que vous essayez de faire. Parfois, cela peut être approprié - par exemple :
- LINQ to Objects, où il est utilisé pour optimiser des opérations telles que
Count
qui peut être réalisée plus efficacement sur un IList<T>
via les membres spécialisés.
- LINQ to XML, où il est utilisé pour fournir une méthode d'analyse de la qualité de l'eau. vraiment une API conviviale qui accepte un large éventail de types, en itérant sur les valeurs lorsque cela est approprié.
- Si vous vouliez trouver tous les contrôles d'un certain type sous un contrôle particulier dans Windows Forms, vous voudriez vérifier si chaque contrôle est un conteneur pour déterminer s'il faut ou non effectuer une récursion.
Dans d'autres cas, c'est moins approprié et vous devriez considérer si vous pouvez changer le type de paramètre à la place. C'est définitivement une "odeur" - normalement, vous ne devriez pas vous préoccuper de l'utilisation de l'attribut mise en œuvre Vous devez simplement utiliser l'API fournie par le type de paramètre déclaré. Ceci est également connu comme une violation de la Principe de substitution de Liskov .
Quoi qu'en disent les développeurs dogmatiques qui nous entourent, il y a des moments où il faut tout simplement faire Je veux vérifier le type de temps d'exécution d'un objet. Il est difficile de remplacer object.Equals(object)
correctement sans utiliser is
/ as
/ GetType
par exemple :) Ce n'est pas toujours une mauvaise chose, mais cela devrait toujours vous faire envisager s'il y a une meilleure approche. Utilisez-la avec parcimonie, uniquement lorsqu'il s'agit véritablement de la conception la plus appropriée.
Personnellement, je préférerais écrire le code que vous avez montré comme ceci, remarquez :
public void DoSomething(IEnumerable<object> things)
{
foreach(var foo in things.OfType<IFoo>())
{
foo.Bar();
}
}
Il accomplit la même chose, mais d'une manière plus soignée :)