C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のis演算子とas演算子の違いと使い方を徹底解説

C#には、オブジェクトの型を安全に扱うための便利な演算子として「is」と「as」が用意されています。この2つの演算子は似たような場面で使われますが、役割と動作は大きく異なります。本記事では、それぞれの演算子の特徴、構文、そして具体的なコード例を通じて、その違いをわかりやすく解説します。

is演算子とは

「is」演算子は、オブジェクトの実行時の型(ランタイム型)が指定した型と互換性があるかどうかを判定するために使用します。判定結果はブール値(true / false)として返されるため、if文などの条件分岐と組み合わせて使うのが一般的です。

構文

expr is type

expr:判定対象となる式
type:互換性を確認する型の名前

型チェックが成功した場合にのみキャストを行いたい場面では、「is」で確認してから明示的なキャストを行うパターンがよく使われます。以下は、C#におけるis演算子の基本的な使用例です。

コード例

using System;

class One { }
class Two { }

public class Demo {
    public static void Test(object obj) {
        One x;
        Two y;

        if (obj is One) {
            Console.WriteLine("Class One");
            x = (One)obj;
        } else if (obj is Two) {
            Console.WriteLine("Class Two");
            y = (Two)obj;
        } else {
            Console.WriteLine("None of the classes!");
        }
    }

    public static void Main() {
        One o1 = new One();
        Two t1 = new Two();
        Test(o1);
        Test(t1);
        Test("str");
        Console.ReadKey();
    }
}

実行結果

Class One
Class Two
None of the classes!

この例では、引数として渡されたオブジェクトが「One」クラスか「Two」クラスのどちらであるかをis演算子で判定し、それぞれに応じた処理を行っています。どちらにも該当しない文字列"str"を渡した場合は、elseブロックのメッセージが出力されます。

なお、C# 7.0以降では「is」演算子とパターンマッチングを組み合わせることで、型チェックとキャストを同時に行うことも可能です。例えば if (obj is One o) のように書くと、判定がtrueの場合に変数oへ自動的にキャストされます。

as演算子とは

「as」演算子は、互換性のある型同士の変換を行うための演算子です。キャスト操作に似ていますが、実行できるのは参照変換・null許容型への変換・ボックス化変換のみという点が特徴です。ユーザー定義の変換など、それ以外の変換はas演算子では行えず、その場合は通常のキャスト式を使用する必要があります。

as演算子のもう一つの重要な特徴は、変換が失敗した場合に例外をスローするのではなくnullを返すという点です。これにより、try-catchによる例外処理を書かずに、nullチェックだけで安全に型変換を行えます。

構文例

string s = obj[i] as string;

以下のコードは、object型の配列に格納された要素をstring型へ変換する例です。変換できない要素についてはnullが返されるため、nullチェックによって判別できます。

コード例

using System;

public class Demo {
    public static void Main() {
        object[] obj = new object[2];
        obj[0] = "jack";
        obj[1] = 32;

        for (int i = 0; i < obj.Length; ++i) {
            string s = obj[i] as string;
            Console.Write("{0}: ", i);
            if (s != null)
                Console.WriteLine("'" + s + "'");
            else
                Console.WriteLine("This is not a string!");
        }
        Console.ReadKey();
    }
}

実行結果

0: 'jack'
1: This is not a string!

配列の最初の要素"jack"はstring型なので正常に変換され、2番目の要素32(int型)はstring型に変換できないためnullが返され、「This is not a string!」と表示されています。

is演算子とas演算子の使い分けのポイント

  • is演算子:型の互換性を確認したいだけの場合や、条件分岐の中で型ごとに処理を分けたい場合に適しています。
  • as演算子:型変換を試みて、失敗した場合に例外ではなくnullで受け取りたい場合に適しています。変換後すぐにnullチェックを行うのが定石です。
  • 値型(intなど)への変換にas演算子は使えないため、その場合は通常のキャストを使用します。

両者を正しく使い分けることで、安全かつ可読性の高いC#コードを書くことができます。

  1. JavaScriptの演算子とは?比較演算子の基本をわかりやすく解説

    JavaScriptの演算子とは? 「10 + 20 は 30 に等しい」というシンプルな式を例に考えてみましょう。この式において、10 と 20 は「オペランド(被演算数)」と呼ばれ、「+」は「演算子」と呼ばれます。JavaScriptでは、主に以下の種類の演算子がサポートされています。 算術演算子 比較演算子 論理演算子(関係演算子とも呼ばれます) 代入演算子 条件演算子(三項演算子) この記事では、中でも頻繁に使われる「比較演算子」について詳しく解説していきます。 比較演算子の一覧 JavaScriptで使える主な比較演算子は次の通りです。ここでは、変数 A に 10、変数 B に

  2. HTML5の数学演算子の使い方!エンティティで数学記号を表示する方法

    HTML5の数学演算子とは? HTML5の数学演算子は、HTML文書内で数学的・技術的な記号(演算子)を表現するために使用されます。Webページ上でこれらの記号を正しく表示するには、HTMLエンティティ名を利用します。対応するエンティティ名が存在しない場合には、10進数または16進数の文字参照(エンティティ番号)を代わりに使用できます。 基本構文 数学演算子をHTMLに記述する際の基本構文は次のとおりです。 ① エンティティ名を使う場合: &operatorName; ② 10進数の文字参照を使う場合: &#演算子の10進コード; ③ 16進数の文字参照を使う場合: &