C#の学習、順調ですね!前回はオブジェクト指向の核となる「継承」「ポリモーフィズム」「インターフェース」を学びました。
今回は、C#でファイルを扱ったり、データのやり取りを行う上で非常に重要な「例外処理」と「ジェネリック」について解説します。
12. 例外処理(Exception Handling)
例外処理とは、プログラムの実行中に発生する予期せぬエラー(例外)を検知し、安全に回復したり、プログラムが突然停止するのを防ぐ仕組みです。C#では主に try-catch-finally
構文を使います。
🚨 try-catch-finally
構文
ブロック | 役割 |
try | 例外が発生する可能性があるコードを記述します。 |
catch | try ブロック内で例外が発生した場合に実行されます。発生した例外の種類に応じた処理を記述し、エラーからの回復を試みます。 |
finally | try または 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)
ジェネリックは、型を一般化(抽象化)するための仕組みです。特定のデータ型(int
、string
、Car
など)に依存しない、再利用性の高いクラスやメソッドを定義できます。
🧩 なぜジェネリックを使うのか?
例えば、「値を格納して取り出す」だけの箱クラスを作りたい場合を考えます。ジェネリックを使わないと、IntBox
、StringBox
、CarBox
と、格納したい型ごとにクラスを作る必要が出てきてしまいます。
ジェネリックを使えば、データ型を T や TKey といった型パラメーターで置き換え、一つの汎用的なクラスで対応できます。
📦 ジェネリッククラスの定義
以下の 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」について解説します。