C#リーダブルコード #10_型チェックはasを使う

当サイトではアフィリエイト広告を利用しています。

リーダブルコード
Subway Station in Munich, Germany. Train coming in. Strong Motion Blur on Train and People, no recognizable Persons.

今回は「型チェックはasを使う」というお話をしていきたいと思います。

BAD:2回型変換が行われて冗長

オブジェクトの型をチェックする場合,isキーワードを使うことで,チェックすることができます。

//型チェックはasを使う
private void 型チェックはasを使う(object obj)
{
    if (obj is Product) //①
    {
        //BAD:2回型変換が行われて冗長
        var product1 = (Product)obj; //②
        Console.WriteLine($"処理...{product1.ProductName}");
    }

}

①のように記述することで,object型のobjオブジェクトが,Product型の場合はTrueが返却されます。型をチェックするだけであればそれでもいいのですが,②のように,Product型の場合はProduct型に変換して,処理に使用する場合は,C#の中で,無駄な型変換が発生し,パフォーマンスが落ちます。というのも,①の型チェックの時点で,C#の中では,すでに型変換を行っており,型変換ができた場合にTrueとなります。その後②でさらに型変換を行うと,2回型変換が行われたこととなり,無駄な処理が発生します。ですので,型チェックだけでなく,その後,型変換をして処理で使用する場合は,後述するasキーワードを使ってチェックすることを推奨します。ちなみにこれは黒くて分厚い.NETFrameworkの解説本でも推奨された書き方です。

GOOD:型の変換が1回

asキーワードを使った型チェックは次のようになります。

//型チェックはasを使う
private void 型チェックはasを使う(object obj)
{
    if (obj is Product)
    {
        //BAD:2回型変換が行われて冗長
        var product1 = (Product)obj;
        Console.WriteLine($"処理...{product1.ProductName}");
    }

    var product2 = obj as Product; //①
    if (product2 != null) //②
    {
        //GOOD:型の変換が1回
        Console.WriteLine($"処理...{product2.ProductName}"); //③
    }
}

①の部分でasキーワードを使って,objをProduct型に変換しています。
②でnullチェックをしています。変換に失敗している場合はnullになるので,それで判定ができます。
nullでない場合はProduct型であることができ,この段階でProduct型に変換がされているため,③のようにすぐに使用することができます。こうすることで,型変換が1回しか行われないため,こちらの書き方を推奨します。型変換はasキーワードを使用し,nullかどうかで判定することを覚えておいてください。