search
LoginSignup
110
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

C#におけるasによるキャストと()によるキャストの違い

概要

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に継承関係がない場合

参考

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
110
Help us understand the problem. What are the problem?