コーディングしている最中に「ソースコードをまとめたい!」と思うときは多々あると思います。C# ではソースコードを共通化する方法として、主にメソッド化・クラス化が主流です。けれども、メソッドやクラスは型による制約が厳しいという現実があります。
そんな「より広い範囲で共通化したい」という要望をかなえるのが「ジェネリック」と呼ばれるものになります。ジェネリックを使用することで「処理は同一だが、型は異なる」ような場面で共通化をすることができます。
ジェネリックとは
まず C# で搭載されている「ジェネリック」に関する基礎部分を解説していきます。ジェネリックは C#2.0 で実装された機能で、様々な型に対応した処理をするために用意されたものになります。C++では「テンプレート」と呼ばれている機能になります。
ジェネリックの肝となる部分は「パラメーターとして型を与え、その型に対応した処理を生成することのできるもの」です。要するに抽象的にメソッドを作成しておき、実際の型は使うときに指定できる、ということですね。
C# で実装を進めていく場合は、特定の型に依存した状態でメソッド等を記述していくのが一般的ですが、型に縛られずに共通化するために、処理の前提となる型をパラメーターとして渡すことで、型に依存せずに処理を記述することが可能となります。
ジェネリックを使う目的
「型に依存しない実装」を行うことのできるジェネリックは以下の利点を持っています。ぱっと見ではジェネリックを使うことで「共通化の幅が広がる」と思いがちですが、それ以外にもメリットは存在するのです。
- 型の安全性(タイプセーフ)
- コード記述の簡易化・共通化
- 処理の高速化
ジェネリックはコードの簡易化を実現することができますが、それ以上に「安全性」を担保できる機能です。ジェネリックメソッドを使用するには、引数の数やデータ型、戻り値の型を指定して定義します。定義と異なる呼び出し方をするとコンパイルエラーになるため、型の安全性(タイプセーフ)を実現することができます。
型が異なっているが、処理内容が共通化しているような処理を抽象化し、呼び出し元から型の条件などを指定して使うことができます。またこれらはメソッドだけでなく、クラスにまで適用することが可能となります。
ジェネリックについて学ぼう
ジェネリックを学ぶことで「より洗練された処理」をコーディングできるようになります。一般的に型に縛られた処理をする場合、処理内容は同じでも型が異なるごとに処理(メソッドやクラス)を作成する必要がありました。
そうした煩わしさから解放されるために、そして、型により処理の制約を抽象化することで、堅牢なソースコードを生み出しながら共通化を図ることができるのです。
もちろん、その分の難易度は上がっていくことになりますが、ジェネリックを身に着けることは「単なる実装者」から「設計をよく考える実装者」になることができ、幅広く API などを実装するためのスキルを手に入れることができるということです。