Есть еще одна вещь, о которой следует подумать, кроме способа, которым компилятор обрабатывает операторы switch
, и это функционирование оператора is
. Есть большая разница между:
if (obj is Foo)
и
if (obj.GetType() == typeof(Foo))
Несмотря на имя, оператор is
сообщает вам, является ли объект совместимым с данным типом, а не если равен данного типа. Это приводит к не совсем очевидным ошибкам (хотя это довольно очевидно), которые выглядят так:
if (obj is System.Object)
{
//this will always execute
}
else if (obj is Foo)
{
//this will never execute
}
Многие из приведенных здесь советов указывают вам, как использовать тип объекта. Это хорошо, если вам действительно нужна логика, связанная с каждым типом. Но если это так, будьте осторожны при использовании оператора is
.
Также: хотя вы не можете изменять эти базовые типы, это не значит, что вы не можете использовать предложение Оуэна. Вы можете реализовать методы расширения:
public enum MyType { Foo, Bar, Baz };
public static class MyTypeExtension
{
public static MyType GetMyType(this Foo o)
{
return MyType.Foo;
}
public static MyType GetMyType(this Bar o)
{
return MyType.Bar;
}
public static MyType GetMyType(this Baz o)
{
return MyType.Baz;
}
}
Тогда вы можете использовать выражение switch
:
switch (myObject.GetType())
{
case MyType.Foo:
// etc.