プログラムを作成していると変数をキャストする事があると思います。
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 演算子の方が早いようです。
よりうまく使いこなしてより良いソースコードを作り上げましょう。
関連記事
- C#の値型と参照型の違い
- C#のコンストラクタでオーバーロード
- C#のコンストラクタの継承
- C#のジェネリックを使おう
- C#のデリゲート (delegate) って何?
- C#のデリゲートお手軽にする匿名メソッド
- C#のラムダ式【=>】って何?
- C#で基底クラスのメソッドを置き換えるオーバーライド
- C#でキャストとas演算子を使いこなす
- C#で型を判別するtypeofとis演算子
- C#の値型でもnullを扱えるようにするNullable
- C#のリソース解放にはIDisposableとusingを使おう
- C#のStringとstring、Int32とint 違いは・・・ない!
- C#でasync/awaitを使った非同期処理
- C#で文字列を指定の区切り文字で分割
- C#のstring.Formatで桁数や書式を指定する
- C#の配列やListをソートする
- C#の配列やListを検索する (Find,FindAll,FindIndex)
- C#の配列やListを高速に検索する (BinarySearch)
- C#の配列の中に指定の要素が存在するかを調べる(LINQ Contains)
- C#の配列の中に条件を満たす要素が存在するかを調べる(LINQ Any)
- C#の配列から条件に合う要素を抽出する(LINQ Where)
- C#の配列で要素毎の処理結果を得る(LINQ Select)
- C#の配列を並び替える(LINQ OrderBy,ThenBy)
- C#の配列をグループ毎に処理する(LINQ GroupBy)
- C#の配列を内部結合(INNER JOIN)する(LINQ Join)
- C#の配列から最初の要素を取り出す(LINQ First,FirstOrDefault)
- C#の配列の重複要素を削除する(LINQ Distinct)
- C#でフォルダ内のファイル名一覧を取得する
- C#でテキストファイルを読み込む
- C#でテキストファイルに書き込む
- C#でバイナリファイルを読み込む
- C#でバイナリファイルに書き込む
コメントをお書きください