リーダブルコード

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

今回は「型チェックは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かどうかで判定することを覚えておいてください。

リーダブルコードC#

#01_はじめに

#02_プロジェクトの作成
#03_右に長いコードを書かない_隣のとなりまでしか訪ねない
#04_隣のとなりまで_右スクロールより縦スクロールの方がいい
#05_IFとELSEがある時は肯定系をIF否定形をELSEにする
#06_比較する時は変数を左_定数を右にする
#07_複数の比較を1回のif文でやらない
#08_booの比較でTrueやFalseを書かない
#09_否定の否定はしない
#10_型チェックはasを使う
#11_メソッドはできるだけ早く抜ける_返却する値を無駄に変数に入れない
#12_対象外の時はすぐに抜ける
#13_都合が悪いケースはガードする
#14_必ずやりたい処理はfinallyを使う
#15_比較演算子はできるだけクラスにさせる
#16_ifの中括弧の省略はしない
#17_if文のリーダブルコードまとめ
#18_名前の付け方
#19_意図が明確な名前を付ける
#20_名前は素直に付ける_連想ゲーム的な名前を付けない
#21_1つの事しかしていなければ短い名前でも理解できる
#22_長いクラス名の扱い方
#23_単数形と複数形で表現する
#24_対になる言葉の組み合わせを決めておく
#25_業務で使う名前は統一する
#26_名前を統一するための辞書ツール作成
#27_メンバー変数にアンダーバーを付ける
#28_ハンガリアン記法を使わない
#29_メソッド内の変数をメソッド最初に全部宣言しない
#30_メソッド内の変数は直前に宣言する
#31_ループの変数はループ内で宣言する
#32_変数を使いまわさない
#33_boolの戻り値はどちらがTrueかをわかるようにする
#34_解放が必要なオブジェクトにはusingを使う
#35_varを推奨する場合
#36_メソッド名の付け方
#37_voidとFunctionを意識する
#38_インテリセンスを意識した名前にする
#39_生成メソッドはCreate_型変換はToを使う
#40_無駄に変数に入れて返却しない
#41_重複をなくす
#42_リージョンで区切らない
#43_アクセス修飾子とsealedを付ける
#44_クラス名はソリューションエクスプローラーで並べることを意識する
#45_クラス名は名詞か名詞句で命名する
#46_クラス名で継承元や特性を表現する
#47_メソッド内にコメントを書かない
#48_分かりづらい部分はメソッド化をしてメソッド名で想いを伝える
#49_コードを読んだ人が「えっ?」と思うことが予想される場所にだけコメントを付ける
#50_コメントで悪いコードを取り繕うことはできない
#51_未実装機能はTODOコメントを書く
#52_リーダブルコードまとめ

下記URLは、ベネッセが提供する教育用プラットフォームにて
私が公開しているプログラミング学習コースです。
無料コースもあるので、よかったらご覧になってみてください。
【無料動画】「C#を勉強する順番」