C#-5

C#の学習、順調ですね!前回はオブジェクト指向の核となる「継承」「ポリモーフィズム」「インターフェース」を学びました。

今回は、C#でファイルを扱ったり、データのやり取りを行う上で非常に重要な「例外処理」と「ジェネリック」について解説します。


12. 例外処理(Exception Handling)

例外処理とは、プログラムの実行中に発生する予期せぬエラー(例外)を検知し、安全に回復したり、プログラムが突然停止するのを防ぐ仕組みです。C#では主に try-catch-finally 構文を使います。

🚨 try-catch-finally 構文

ブロック役割
try例外が発生する可能性があるコードを記述します。
catchtry ブロック内で例外が発生した場合に実行されます。発生した例外の種類に応じた処理を記述し、エラーからの回復を試みます。
finallytry または catch の実行後、例外が発生したかどうかに関わらず、必ず実行される処理を記述します。リソースの解放(ファイルやデータベース接続のクローズ)などに使われます。

Google スプレッドシートにエクスポート

C#

try
{
    // 1. 例外が発生する可能性のある処理 (例: 0での割り算)
    int a = 10;
    int b = 0;
    int result = a / b; // System.DivideByZeroException が発生
    
    System.Console.WriteLine($"結果: {result}"); // 例外発生によりここは実行されない
}
catch (System.DivideByZeroException ex) // 発生した例外の型を指定
{
    // 2. 0で割ったときだけ実行される処理
    System.Console.WriteLine("エラーが発生しました: 0で割ることはできません。");
    // ex.Message で例外の詳細メッセージを取得できる
}
catch (System.Exception ex) // 上記以外の、すべての例外をキャッチ
{
    // 3. その他の予期しない例外が発生した場合に実行される
    System.Console.WriteLine($"致命的なエラー: {ex.Message}");
}
finally
{
    // 4. エラーの有無にかかわらず必ず実行される
    System.Console.WriteLine("処理を終了します。");
}

13. ジェネリック(Generics)

ジェネリックは、型を一般化(抽象化)するための仕組みです。特定のデータ型(intstringCarなど)に依存しない、再利用性の高いクラスやメソッドを定義できます。

🧩 なぜジェネリックを使うのか?

例えば、「値を格納して取り出す」だけの箱クラスを作りたい場合を考えます。ジェネリックを使わないと、IntBoxStringBoxCarBoxと、格納したい型ごとにクラスを作る必要が出てきてしまいます。

ジェネリックを使えば、データ型を TTKey といった型パラメーターで置き換え、一つの汎用的なクラスで対応できます。

📦 ジェネリッククラスの定義

以下の Box<T> クラスは、どんな型(T)のデータでも一つ格納できる「箱」として機能します。

C#

// <T> は「型パラメーター」。TはTypeの略で、任意の型が入ることを示す
public class Box<T> 
{
    private T _data; // T型のフィールド

    public Box(T data)
    {
        _data = data;
    }

    public T GetData() // T型の戻り値
    {
        return _data;
    }
}

// 実行例:一つのクラス定義で複数の型に対応

// 整数(int)を扱うBox
Box<int> intBox = new Box<int>(100);
int value = intBox.GetData();
System.Console.WriteLine($"整数: {value}"); // 出力: 100

// 文字列(string)を扱うBox
Box<string> stringBox = new Box<string>("こんにちは");
string text = stringBox.GetData();
System.Console.WriteLine($"文字列: {text}"); // 出力: こんにちは

💡 コレクションとジェネリック

これまで学んだ List<T>Dictionary<TKey, TValue> などは、すべてジェネリックを使って定義されています。

  • List<string>:リスト内の要素の型を string に指定
  • Dictionary<int, string>:キーの型を int、値の型を string に指定

ジェネリックを理解することで、C#の標準ライブラリをより深く理解し、自分で汎用的なユーティリティを作成する能力が向上します。

次回は、C#でのデータ処理を劇的に簡単にする「LINQ」について解説します。