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