C#でキャストとas演算子を使いこなす

プログラムを作成していると変数をキャストする事があると思います。

C#では、このキャストに似たような動作をする as 演算子 というものがあります。

 

キャストas演算子をうまく使う事でより簡潔なコードが書けるようになります。

アップキャストとダウンキャスト

アップキャスト

アップキャストは派生クラスから基底クラスへのキャストです。

派生クラスは基底クラスを内包しているので常に安全にキャストする事ができます。

 

プログラムを記述する時は明示する必要はありません。

class Base {}
class Derived : Base{}

class Test
{
    static void Main()
    {
        Base    a = null;
        Derived b = new Derived();

        a = b;              //←アップキャスト
    }
}

ダウンキャスト

ダウンキャストは基底クラスから派生クラスへのキャストです。

この場合、元々派生クラス(もしくは派生クラスの派生クラス)のインスタンスとして作成され、それがアップキャストされた基底クラスからでなければキャストは成功しません。

 

プログラマーが意図したキャストである事を示すためキャストを明示する必要があります。

キャストに失敗すると例外 InvalidCastException がスローされます。

class Base {}
class Derived1 : Base{}
class Derived2 : Base{}

class Test
{
    static void Main()
    {
        Base     a = new Derived1();
        
        Derived1 b = (Derived1)a;        //←ダウンキャスト 成功
        Derived2 c = (Derived2)a;        //←ダウンキャスト 失敗
    }
}

as 演算子

キャストとよく似た動きをする as 演算子 というものがあります。

as 演算子を使う事でも互換性のある参照型または null 許容型間で特定の型変換を実行できます。

 

変換できない場合、キャストが例外をスローするのに対して as 演算子null を返します。

変換が正しく行えたかを判断する必要がある場合、as 演算子 を利用する事で簡潔なコードが書けるかもしれません。

class Base {}
class Derived1 : Base{}
class Derived2 : Base{}

class Test
{
    static void Main()
    {
        Base     a = new Derived1();
        
        Derived1 b = a as Derived1;        //成功
        Derived2 c = a as Derived2;        //失敗
        if (null == c)
        {
            //ここに来る
        }
    }
}

null を返すという性質上 as 演算子は int や double のような null が入らない型には使用できませんが、処理速度はキャスト as 演算子の方が早いようです。

よりうまく使いこなしてより良いソースコードを作り上げましょう。