「スイッチオンタイプ」よりも良い代替手段はありますか? 質問する

「スイッチオンタイプ」よりも良い代替手段はありますか? 質問する

switchC# はType ではできないので(is関係によって複数の distinctcaseが適用される可能性があるため、特別なケースとして追加されたわけではないと思います)、これ以外に Type の切り替えをシミュレートするより良い方法はありますか?

void Foo(object o)
{
    if (o is A)
    {
        ((A)o).Hop();
    }
    else if (o is B)
    {
        ((B)o).Skip();
    }
    else
    {
        throw new ArgumentException("Unexpected type: " + o.GetType());
    }
}

ベストアンサー1

C# 7の場合caseVisual Studio 2017 (リリース 15.*) に同梱されている では、ステートメント (パターン マッチング)で型を使用できます。

switch(shape)
{
    case Circle c:
        WriteLine($"circle with radius {c.Radius}");
        break;
    case Rectangle s when (s.Length == s.Height):
        WriteLine($"{s.Length} x {s.Height} square");
        break;
    case Rectangle r:
        WriteLine($"{r.Length} x {r.Height} rectangle");
        break;
    default:
        WriteLine("<unknown shape>");
        break;
    case null:
        throw new ArgumentNullException(nameof(shape));
}

C# 6では、switch文をnameof() 演算子(ありがとう @Joey Adams):

switch(o.GetType().Name) {
    case nameof(AType):
        break;
    case nameof(BType):
        break;
}

C# 5 以前では、switch ステートメントを使用できましたが、型名を含むマジック文字列を使用する必要があります...これは、特にリファクタリングに適していません (@nukefusion に感謝)

switch(o.GetType().Name) {
  case "AType":
    break;
}

おすすめ記事