switch
コンパイラがステートメントを処理する方法以外に、考慮すべきことがもう 1 つあります。それは、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
オペレーターを使用するときは慎重に歩いてください。
また、これらの基本型を変更することはできませんが、それは Owen の提案を使用できないという意味ではありません。拡張メソッドを実装できます:
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.