atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
プログラミング図書館・本館
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
プログラミング図書館・本館
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
プログラミング図書館・本館
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • プログラミング図書館・本館
  • CS
  • ジェネリクス

ジェネリクス

最終更新:2011年01月25日 14:51

atachi

- view
管理者のみ編集可

ジェネリクス

ジェネリクスとは特定の型をタイプセーフに受け渡しができる関数やクラスの定義方法です。
似た書式と目的にC++言語のテンプレートがありますが、C#のジェネリクスは実装方法と概念が根本的に異なります。

ジェネリクス関数

型引数に与えられる実際の型は、コンパイル時に決定する。

public static T Max<T>(T a, T b) 
	where T : IComparable //型引数はIComparable型であることを制約している
{
	return a.CompareTo(b) > 0 ? a : b;
}
 
//呼び出しは次の通り
int n1 = Max<int>(5,10); // 型を明示的に指定(Javaと同じ呼び出し方法。安全。)
int n2 = Max(5,10); // 引数の型から、int型のジェネリクスを暗黙に推移。
double d1 = Max(5.0,10.0); // 引数の型から、double型
string str = Max("abc","ABC"); //

ジェネリクスクラス

Javaのジェネリクスと同じ。

// generics 版スタッククラス
class Stack<T>
{
	T[] buf;
	int top;
 
	public Stack(int max) {
		this.buf = new T[max];
		this.top = 0;
	}
	public void Push(T val) { 
		this.buf[this.top++] = val; 
	}
	public Type Pop() { 
		return this.buf[--this.top]; 
	}
	public int Size {
		get 
		{
			return this.top;
		}
	}
	public int MaxSize{
		get
		{
			return this.buf.Length;
		}
	}
}
 
// ジェネリクスクラスのインスタンス作成
Stack<int> si = new Stack<int>(10);
Stack<string> ss = new Stack<string>(5);

型の制約

public static T Max<T>(T a, T b) 
	where T : IComparable //型引数はIComparable型であることを制約している
{
	return a.CompareTo(b) > 0 ? a : b;
}

この場合、型引数T はIComparableを実装する型であるという制約を設けています。
T は IComparableであることが保証されているため、IComparable.CompareTo()が呼び出される。

共変性・反変性のサポート

C#4からはジェネリクスに共変性・反変性が実装された。

「配列→ジェネリックコレクション」への変換

string[]やMyClass[]のような配列を、ジェネリックなコレクションへ変換することはできません。
代わりに、ジェネリックなコレクションを作成し、そこに要素を追加していく処理となります。

ICollection<T>は配列をコレクションに追加するようなメソッドは用意されていません。よって、foreach構文を使って配列を逐次コレクションに代入する処理を行う必要があります。

下記のサンプルでは、foreach構文を使う代わりにArrayが持つサポートメソッドを使っています。
Array.ConvertAllとラムダ式を使うことで、「配列→ジェネリックコレクション」への変換をワンライナーで記述できます。

MyClass[] myclasses = ...; // MyClassの配列
 
ICollection<MyClass> c = Array.ConvertAll(myclasses, prop => (MyClass)prop);

IDisposableの問題

ジェネリックなクラスを実装する際に、パラメータTのインスタンスを作成する必要があるクラスを実装する場合に、IDisposableインターフェースが実装されている場合に問題が発生します。

public class MyClass<T> where T : new() {
	public void SomeMethod() {
		// Tのインスタンスを作成する
		T obj = new T();
		obj.Method();
	}
}

上記はジェネリクスクラスであること以外は一般的なコードです。

しかし、ジェネリクスクラスであるが故の問題がはらんでいます。上記のクラスはパラメータTに任意のクラスを指定することができますが、パラメータTがIDisposableを実装している場合にこのコードはリソースリークを起こします。IDisposableインターフェースを実装したクラスは必ずDispose()を呼び出さなければならないためです。

ジェネリッククラス内で、パラメータTのインスタンスを作成する必要がある場合には下記のようにusing構文を使用すべきです。

public class MyClass<T> where T : new() {
	public void SomeMethod() {
		// Tのインスタンスを作成する
		T obj = new T();
		using(obj as IDisposable){
			obj.Method();
		}
	}
}

ラムダ式

C#ではラムダ式を使用することで、ロジックの表現を簡略化できる。

(引数リスト) => {式};

または、式が単文の場合はパーレンを省略できる。
(引数リスト) => 式;
delegate bool Pred(int n);
 
Pred p = delegate (int n) {
	return n > 0;
}
// 上記のような匿名メソッドは、ラムダ式で次のように表現できる。
p += (int n) => { return n > 0; }
p += (int n) => n > 0;
 
// p の型がわかっているので、
// エンティティの引数のシグネチャから型の指定を省略できる
p += n => n > 0;

オブジェクトのシリアライズ

XMLへのシリアライズ

C#2以降ではジェネリクスを駆使してXMLへのシリアライズ・デシリアライズというパターンをタイプセーフに実装できます。

このテクニックの利点は、シリアライズ対象のオブジェクトにシリアライズのためのコードが不必要な点です。

public static XmlPersistenceManager<T> {
	public static T LoadFromFile(string filePath) {
		if( File.Exists(filePath) ) {
			using( XmlReader is = XmlReader.Create(filePath) ) {
				return ReadFromStream(is);
			}
		}
 
		return default(r);
	}
 
	public static void SaveToFile(string filePath,T data) {
		using( XmlWriter writer = XmlWriter.Create(filePath) ) {
			AddToStream(writer, data);
		}
	}
 
	public static T ReadFromStream(XmlReader is) {
		if( factory == null ) {
			factory = new XmlSerializer( typeof(T) );
		}
		T r = (T)factory.Deserialize(is); // 「as T」は使えない
		return r;
	}
 
	public static void AddToStream(XmlWriter os,T data) {
		if( factory == null ) {
			factory = new XmlSerializer( typeof(T) );
		}
		factory.Serialize(os, data);
	}
 
	#region Fields
 
	private static XmlSerializer factory;
 
	#endregion Fields
}
「ジェネリクス」をウィキ内検索
LINE
シェア
Tweet

[Amazon商品]


プログラミング図書館・本館
記事メニュー

C#

  • 新機能
  • 言語文法
    • 型
    • 関数
    • クラス
    • 演算子
    • 構文
    • デリゲート
    • イベント
    • 例外処理
    • アトリビュート
    • 名前空間
    • ジェネリクス
  • リフレクション
  • LINQ

.NET Frameworks

  • 数値
  • 文字列
  • 日付時刻
  • オブジェクト
  • コレクション
  • ファイルシステム
  • スレッド
  • データテーブル
  • グラフィックス
  • デバッグ
    • ログ出力
    • ユニットテスト
  • ユーティリティ
  • ネットワーク
    • HTTP
  • デバイス
    • COMポート
  • EntityFrameworks
    • Code First Programming Model
  • デバイスドライバ
    • WinUSB

WPF

  • XAML
  • イベント
  • コマンド
  • スタイル
  • データバインディング
  • コンポーネント
  • グラフィックス
  • カスタムコンポーネント
    • 依存関係プロパティ

アプリケーション

  • 二重起動の防止
  • アンマネージドDLLの読み込み
  • 外部のアプリケーションを起動

VisualStudio

  • 拡張機能
  • カラー設定

ライブラリ

  • WPFToolkit
  • A Fast CSV Reader
  • AvalonDock

実装方法

  • ドラッグアンドドロップ
  • アプリケーション内のドラッグアンドドロップ
  • CSVからDataTable

minecraft

  • Bukkit
  • プラグイン
    • Permissions
    • SlowHealth
    • CookieMonster
    • iConomy
    • WorldGuard
    • Lockette
    • MyHome
    • BorderGuard

サイトについて

プロフィール/リンク/未分類

メモ/ゲーム/Stacks/Omoikane


更新履歴

取得中です。

ここを編集

記事メニュー2

読んでいる本


Effective C#

QLOOKアクセス解析

ここを編集

人気記事ランキング
  1. .NET/WinUSB
  2. WPF/コンポーネント/コントロール/テキストボックス/バリデーション
  3. WPF/コマンド
もっと見る
最近更新されたページ
  • 5035日前

    Bukkit
  • 5041日前

    トップページ
  • 5062日前

    メニュー
  • 5072日前

    WPF/グラフィックス
  • 5072日前

    .NET/グラフィックス
  • 5072日前

    .NET/グラフィックス/画像の書き込み
  • 5072日前

    .NET/グラフィックス/画像の読み込み
  • 5078日前

    .NET/コレクション
  • 5096日前

    .NET/WinUSB
  • 5131日前

    BorderGuardプラグイン
もっと見る
人気記事ランキング
  1. .NET/WinUSB
  2. WPF/コンポーネント/コントロール/テキストボックス/バリデーション
  3. WPF/コマンド
もっと見る
最近更新されたページ
  • 5035日前

    Bukkit
  • 5041日前

    トップページ
  • 5062日前

    メニュー
  • 5072日前

    WPF/グラフィックス
  • 5072日前

    .NET/グラフィックス
  • 5072日前

    .NET/グラフィックス/画像の書き込み
  • 5072日前

    .NET/グラフィックス/画像の読み込み
  • 5078日前

    .NET/コレクション
  • 5096日前

    .NET/WinUSB
  • 5131日前

    BorderGuardプラグイン
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  2. MadTown GTA (Beta) まとめウィキ
  3. R.E.P.O. 日本語解説Wiki
  4. シュガードール情報まとめウィキ
  5. ソードランページ @ 非公式wiki
  6. AviUtl2のWiki
  7. Dark War Survival攻略
  8. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  9. ヒカマーWiki
  10. 星飼いの詩@ ウィキ
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  5. 初音ミク Wiki
  6. 発車メロディーwiki
  7. 検索してはいけない言葉 @ ウィキ
  8. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  9. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
  10. オレカバトル アプリ版 @ ウィキ
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 参加者一覧 - ストグラ まとめ @ウィキ
  2. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  3. ストグラハードコア - ストグラ まとめ @ウィキ
  4. 機体一覧 - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  5. 鬼レンチャン(レベル順) - 鬼レンチャンWiki
  6. ヤマダ電機の唄 - アニヲタWiki(仮)
  7. 危険度7 - 検索してはいけない言葉 @ ウィキ
  8. チンポ画像収集場 - 検索してはいけない言葉 @ ウィキ
  9. ドンキーコング バナンザ - アニヲタWiki(仮)
  10. 寧波(ジョジョの奇妙な冒険) - アニヲタWiki(仮)
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.