概要
asによるキャストと()によるキャストを
- キャストできないときの処理
- 使用できる型
- 処理速度
という観点でみていきます。
本題
キャストとは
- キャストとは、ある型を指定した別の型に変換することを言います。
- アップキャストとダウンキャストがあります。
アップキャスト
- 派生クラスから基底クラスへの型変換です。
- 暗黙的な型変換が行われます。
object obj = new Person();
ダウンキャスト
- 基底クラスから派生クラスへの型変換です。
- 暗黙的な型変換は行われません。
Person p = (Person)obj;
ダウンキャストの場合、継承関係のない型同士の変換ではコンパイルは通りますが、実行時に例外が発生してしまいます。
キャストできないときの処理
- asによるキャスト:
null
を返します。 - ()によるキャスト:
System.InvalidCastException
という例外を投げます。
using System;
class CastSample{
public static void Main() {
object nyanchu = "nyanchu"
CastSample cs1 = nyanchu as CastSample
Console.WriteLine(cs1 == null); // True
try
{
CastSample cs2 = (CastSample)nyanchu;
}
catch(InvalidCastException e)
{
Console.WriteLine(e.ToString()); // System.InvalidCastException: 指定されたキャストは有効ではありません。 at CastSample.Main()
}
}
}
使用できる型
- asによるキャスト: 参照型への変換のみ行うことができます。
- ()によるキャスト: 値型・参照型問わず使用できます。
// OK
int i = (int)1;
// NG
int i = 1 as int;
// コンパイル時に
// 「as オペレータは参照型で使用してください ( 'int' は値の型です )。」
参照型と値型
-
値型
-
変数を宣言すると、値そのものが格納される領域が用意されます。
-
メソッドの引数に渡される場合は値の複製が作られ、その複製が渡されます。
-
代入するときは代入先の変数領域に値が複製されます。
-
継承ができません。
-
string、配列、クラス等
-
参照型
-
変数を宣言すると、オブジェクトへの参照が格納される領域が用意されます。
-
メソッドの引数に渡される場合はインスタンスへの参照が渡されます。
-
代入するときはインスタンスの参照が代入されます。
-
原則として継承できます。
-
byte、int、long、double、decimal、char、bool、構造体等
処理速度
- ()によるキャストよりもasによるキャストの方が高速。
- 例外処理を考慮し、isで型チェックを行ってもなおasによるキャストの方が高速。
(ということがこの記事を読むとわかります!)
is演算子
- あるオブジェクトが指定された型と互換性があるかをチェックしてboolを返してくれます。
object obj = new Nyanchu();
bool b1 = obj is Nyanchu; // True
bool b2 = obj is object; // True
bool b3 = obj is Oneisan; // False
// ※ NyanchuとOneisanに継承関係がない場合