スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

拡張メソッド

会社の同僚さんに聞かれたので、ついでにメモっておくことにしよう。
C#3.0以降から追加された機能に拡張メソッドがある。

これは、クラスを拡張することなく、メソッドを追加しよう!

というコンセプトらしい。使う側から見れば、

まるでそのクラス自身のメソッドを使っているかのように実装できるメソッドを作ろう!

なんだけど。有名な拡張メソッドがLINQが持つ、IEnumerable<>クラスを拡張するメソッドの数々だったりする。
○ルールとか制約とか
・拡張メソッドの主(メソッドが操作する型)をthisで渡す。
・拡張メソッドは、static classにしか実装できない。
・拡張メソッド自身もstaticメソッドのみ。
・あくまで外部のメソッドなので、内部な変数やメソッドにアクセスできない。
○方針
thisで渡されたオブジェクトに対して、nullチェックをしてはいけない。
○メリット
 usingさえすれば、拡張メソッドを持つクラスの名前をしる必要がないし、記述する必要もない。
 インターフェースに対して、共通のメソッドを拡張メソッドで提供すると、サブクラスでの実装が必要なくなる(当然制限あり、実装しすぎ要注意)。
○デメリット
 実際の実装箇所を探すのに苦労する(VS2010等であれな。「定義を参照する」で解決する)。
○参考記事
 拡張メソッド
 拡張メソッド (C# プログラミング ガイド)
(追記)
○nullチェックをしてはいけないの補足。
例えば、WPFにおいて、デザインモードかどうかを判定するメソッドを実装したとする。

public static class DependencyObjectExtension {

/// <summary>
/// デザインモードかどうかを取得します。
/// </summary>
/// <param name="dpObj"></param>
/// <returns>true:デザインモード</returns>
public static bool IsInDesignMode(this DependencyObject dpObj) {
if (dpObj == null) {
return false;
}

return System.ComponentModel.DesignerProperties.GetIsInDesignMode(dpObj);
}
}

このメソッド内で引数のnullチェックをしてしまっている。
そうすると、nullである変数に対してこのメソッドは実行できてしまう。これは矛盾するし、違和感を覚える。せめてNullRefernceExceptionを発行させるのが筋かな。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。