C#の拡張メソッドとの使用

大規模な森林ネットワーク技術を見つけるために、プラットフォーム、サイト構築、ソフトウェア開発、システム運用・保守を、GPS!
http://cnsendnet.taobao.com
セン科学技術公式ブログから
http://www.cnsendblog.com/index.php/?p=476

拡張メソッドを使用すると、再コンパイル、またはそれ以外の場合は元の型を変更し、新しい派生型を作成することなく、既存の型にメソッドを「追加」することができます。拡張メソッドは、静的な方法の特別な種類であるが、膨張の同じタイプのインスタンスメソッドとして呼び出すことができます。これらは、拡張メソッドのMSDN公式サイトの記述であり、今私は、シーンの一例で、この行為を説明する必要があります。次のように主な機能は、コンソールプログラムクラスプログラムを{}とします。

静的な無効メイン(文字列[] args)
{
日時今= DateTime.Now。
ストリング時間= now.ToString( "YYYY-MM-DD HH:MM:SS")。
Console.WriteLineを(時間);
Console.ReadKey();
}

仮定需要は、「YYYY-MM-DD」形式になるために、日付の表示形式を変更したコースだけ時間初期化以下の文言によって書き換えることができます:
文字列= now.ToString時間(「YYYY-MM-DD」を);
しかし、あなたが日付形式を変更したい場合は、それのような多くのがありますか?それぞれが再度変更しなければなりませんか?このような要求したら、彼らはあまりにも忙しい人の意見を変えます。伝統的な解決策は、書き込み方法では、その他のタイプのコールのために、ヘルパークラスをパッケージ化することです。
現在のプロジェクトDateHelperクラスで、本実施形態の模倣を追加:publicクラスのクラスメソッドで定義されDateHelper {}:
パブリック静的文字列dateToString(DateTime型DT)
{
dt.ToString( "MM-DD-YYYY HH:MM:SS")を返します;
}
このように書き換え、元の主な機能は次のとおり

静的な無効メイン(文字列[] args)
{
日時今= DateTime.Now。
文字列の時間= DateHelper.DateToString(今)。
Console.WriteLineを(時間);
Console.ReadKey();
}

ニーズの変更であれば、この時点で、あなただけの行にDateToString()メソッドのDateHelpクラスを書き換える必要があり、多くのクラスは、このメソッドを呼び出すどんなには、影響を受けることになります。問題を解決しますが、このクラスは別の方法、またはトラブルのビットを呼び出すために、ダイレクトコールそれとしてnow.DateToString()のように、私たちを作るための方法はありませんか?もちろん、MicrosoftはDateTimeのは、それが拡張メソッドにつながるので、私たちは、あなたがしたいインスタンスメソッドを作成することはできません、変更することはできません、書かれています。
以下は、素子拡張方法であって、
この方法は、静的メソッドでなければならない1.
2.この方法は、静的クラスに配置する必要があり
、この方法の最初のパラメータはこれを開始する必要があり、この方法は、からどのタイプを指定するように拡張され、3
ザ・複数の要素は、我々はDateHelperクラス静的クラスを変更します。public staticクラスDateHelper {}、dateToString()メソッド書き換えつつ:
パブリック静的文字列dateToString(これのDateTime DT)
{
リターンdt.ToString(「MM-DD-YYYY HH:MMの: SS「);
}
この場合にはその入力はメイン関数にメソッドが戻る。」今「dateToString自動的プロンプト()メソッド、およびコードを有することが分かるであろうが、このように書くことができます。

静的な無効メイン(文字列[] args)
{
日時今= DateTime.Now。
ストリング時間= now.DateToString()。
Console.WriteLineを(時間);
Console.ReadKey();
}

明らかに、これはそれらを使用する方が便利になり、そのため、私たちはただ、それ自体は非常に読みやすい展開の同じ種類を、持っているインスタンスメソッドであることのように見てみましょう。拡張メソッドの集計特徴次
型から延びる1拡張メソッドは、他の型を使用する変数のこのタイプである必要があり、この場合に、使用することができないのDateTime型から延び、それは唯一のタイプのDateTimeアウトの変数とすることができます。 (()now.DateToString)
この拡張方法2の後ろにパラメータをメソッドのパラメータではなく、本実施形態では後者の、何のパラメータではないが、この日時に指定されているどのようなタイプの方法を拡張DT
拡張メソッドおよび実施例3の場合同じシグネチャ、優先呼インスタンスメソッド有する方法
4.親クラスから拡張メソッド、オブジェクトを直接使用することができるサブクラス
5.インターフェースから延び、物体を直接実装することができるクラス
6の方法の最終伸長またはへのコンパイラ:この場合のnow.DateToString()で静的クラスの静的メソッド()は、最終的にその本質であるDateHelper.DateToString(今)、にコンパイルされます
実際には、我々が発生する可能性がありますこのような時のインターフェース拡張における方法としてのシナリオ、実装インタフェースメソッドは、新しい拡張を達成しなければならないことをすでにクラスのすべてが、この変更は非常にあります 仕事の疲れている、あなたは拡張メソッド「Quxianjiuguo」を使用することができ、そして時には我々は変更したくない、このクラスのクラスに新しいメソッドを追加したい場合、拡張メソッドのこの方法は、「擬似追加」のアプローチは、その値を反映します。最も一般的な方法は、1024ポイントは賞賛に勝つ必要があるコードの農家に、この便利で効率的な方法を多用してLINQ標準クエリ演算子を拡張することです。

拡張メソッドとは何ですか?
  拡張メソッドは、文字通り拡張の方法を参照し、オブジェクト指向プログラミングパターンにこの対応するクラスを拡散する方法を指します。いつもの理解によると、私たちはまず、あなたがクラスの拡張メソッドを提供する目的を達成することができますのでことを、クラスのソースコードを入手して、コード内でこのクラスのメソッドのメンバーを追加する必要があります。しかし残念ながら、ソースコードでは、この方法は、あなたが働くことができない場合ではない、と私たちは、コード全体の安定性を弱体化させる可能性があり、人為的にソースコードを変更しました。その前提のソースコードを変更せずにクラスを拡張する方法を提供する方法はありますか?これは、我々が今日言いたい拡張メソッドであるので、我々は方法が前提のソースコードを変更せずに外部に拡張するための方法を提供し理解するための方法を拡張することができます。実装するためのC#での拡張メソッドは、我々はUnity3Dゲーム開発で行うなど、それはDOTweenこのプラグインを使用することができる、比較的簡単です。このプラグインは大幅に改善された効率よりもそこアニメーションプラグイン、iTweenを書き換える作者iTweenれます。さらに重要な点は、それは我々が呼ぶときに、これらのAPIインターフェイスは、我々はより多くのUnity3Dネイティブ関数を使用してのように、プラグインを使用しているので、我々はDOTweenを使用する場合と感じることは困難であるような方法を達成するための拡張メソッドを使用していることです+ uGUIの心は非常に快適になります。この組み合わせ、一般的なような場所にすべての秋。
拡張メソッドの特徴は何ですか?
  拡張メソッドは、オブジェクト指向プログラミングで実装され、通常は、換言すれば、我々は唯一のクラスを定義し、適切な方法は、その中に実装することができる追加する必要があり、同じです。しかし、ここで注意すべき3点が存在する場合に最初には、実装クラスの拡張メソッドは、クラス達成するためのクラスと静的クラスと拡張メソッドの名前とは独立でなければなりません;。、拡張メソッドを実装するクラスメソッドは静的メソッドでなければならない第二、第三、最初のパラメータクラスメソッド拡張メソッドを実装するには、クラスの拡張を達成するために、このキーワードメソッドを使用して指定する必要があります。例えば、我々はそれを行う方法であるべき文字列型のためオーバーライド:メソッドを拡張したい場合は、正当な文字列が整数型に変換することを、あなたは、int.parse()メソッドを使用することができます知っていますか?一緒に私たちは、次のコードを見て:

  1. /// <要約>
  2. /// 1、静的クラスの定義
  3. /// 2、静的クラス名と拡張メソッドを達成するための具体的なクラスは独立して
  4. /// </要約>
  5. パブリック静的クラス工ass
  6. {
  7. /// <要約>
  8. /// 3、特定の静的メソッドを達成するために
  9. /// </要約>
  10. 最初のパラメータを使用して///ます。<param name =「STR」>図4は、このキーワード拡張方法</ PARAM>のタイプを指定するために使用されなければなりません
  11. /// <リターン> </リターン>
  12. オーバーライド:int型のpublic static(この文字列str)
  13. {
  14. リターンint.Parse(STR);
  15. }
  16. }
    C#は、拡張メソッドをサポートしていますが、.NET3.5バージョンで開始する拡張メソッドを書くときに、そう、必ずあなたの.NETバージョンは、この要件を満たしていることを確認します。バージョン述べ、特に後に、多くの友人があるUnity5.0 Unity3Dの友人から学習を開始、メッセージが頻繁に私のコードは私のブログなどでも同様の問題、私はこの世界を考える、新しい環境では動作しません言及更新は間違いなくだった最速のIT技術、我々は問題ありませんが、時々あるため、このような技術開発とPython2.7のpython3、Unity4.XとUnity5.Xなど歴史問題の新しいバージョンを使用し、これは時にバージョン発生する可能性があります非互換性の問題、ネットワーク上のリソースが最新でない場合は、この時間は、古代の格言を参照するために使用されているネットワーク上の関連するブロガーの記事や書籍を思わので、あなたは、タイムリーに正式な日付のドキュメントをチェックアウトすることを示唆している:やります文字の本はありません本として、唯一の客観的、冷静に正しい知識を決定するか、私たちは本当に便利な知識を習得することができません。
      さて、今私たちは、この拡張メソッドを書き終えた後、次のような拡張メソッドを使用することができます。
  17. 文字列str = "1234";
  18. int型のval = str.ToInt();
    この例では、我々はそれを行う方法を拡張メソッドにパラメータを渡す必要があるときに、引数なしで拡張メソッドを作成する方法をお見せするには?私達はちょうど最初の引数の十分後に文のパラメータを追加していく必要があります。たとえば、私たちはしばしばUnity3Dに配置された3Dオブジェクトは、通常、我々は以下のコードによって実現することができる調整する必要がある
    。transform.positionのVector3新しい新=(1,1,1)
    このコードは、これまでのところ、比較的単純であるが、私たち私たちのコードが再び座標計算に関与した場合、その位置のプロパティに加えて、そこlocalPositionプロパティを知っているUnity3D、私は、コードが非常に長くなるだろうと信じています。時々私達はちょうど3次元座標の大きさを変更したいのですが、我々は3次元座標transform.positionを与える必要があり、驚くことではないが、この時点でコードが長くなり、より多くの何です。この問題を解決するために、我々は、3つのメソッドを拡張することができSetPositionX、SetPositionY、SetPositionZそれぞれX、Y、三の成分割り当てのz座標は、我々は方法工assこのクラスの追加を続行として得ました:
  19. /// <要約>
  20. /// XはTranformの座標セット
  21. /// </要約>
  22. ///ます。<param name = "TRAN">当前変換</ param>の
  23. ///ます。<param name = "X"> X坐标</ param>の
  24. 公共の静的な無効SetPositionX(この変換TRAN、フロートx)は、
  25. {
  26. tran.position =新規のVector3(X、tran.position.y、tran.position.z)。
  27. }
  28. /// <要約>
  29. /// YはTranform座標セット
  30. /// </要約>
  31. ///ます。<param name = "TRAN">当前変換</ param>の
  32. ///ます。<param name = "X"> Y坐标</ param>の
  33. 公共の静的な無効SetPositionY(この変換TRAN、フロートY)
  34. {
  35. tran.position =新規のVector3(tran.position.x、Y、tran.position.z)。
  36. }
  37. /// <要約>
  38. /// ZはTranform座標設定
  39. /// </要約>
  40. ///ます。<param name = "TRAN">当前変換</ param>の
  41. /// <PARAM名= "X"> Z坐标</ PARAM>
  42. 公共の静的な無効SetPositionZ(この変換TRAN、フロートZ)
  43. {
  44. tran.position =新規のVector3(tran.position.x、tran.position.y、Z)。
  45. }
    の拡張方法の長所と短所使用し
      、我々はここにいるので、下の拡張メソッドを使用しての長所と短所を議論するために、使用に便利な拡張メソッドを。もちろん、Visual Studioのスマートヒントでクラスと拡張メソッドを拡張するための自由と故意の使用の拡張メソッドの利点は、青い下矢印によって識別されます。ダウンサイド拡張メソッドは、私はしばしば非現実Engine4ゲームにグループでUnity3Dゲームエンジン軽蔑の人々を聞く、より良いあなたは、実際には、すべての技術が同じで、この機能を管理できる拡張メソッドの人々のデザインを見ることですラシュモア山エンジンの世界で、私はUE4良い画像効果を認めるが、実際にこのエンジンを十分に活用することができ、どのように多くの人々のですか?拡張メソッドを使用している場合は、特定のクラスではなく、抽象クラスを達成するための最小の範囲で拡張メソッド、拡張メソッドを使用することである近接の原理を、従ってください。私たちは、このコード全体として、論理的な抽象化レイヤを変更する必要はありませんので、それは、論理的なレベルで、このようなAの機能を必要とするため、我々は単に拡張メソッドを使用する「汚染。」簡単な例を取るために、私たちはクラスを拡張する場合、それは「公害」とは明らかに望ましくない原因と思われるオブジェクトのクラスから継承されたすべてを、影響する疑いがある、.NET基本クラスがオブジェクトであることを知っていますA。
    まとめ
    •C#で実装クラスの拡張メソッドは、静的クラスとクラス名でなければならず、拡張メソッドクラスの実現には何の関係もありません
    •メソッドの実装を拡張するクラスの道を静的メソッドでなければなりません
    拡張メソッドがある必要があります最初のパラメータ•実装クラスメソッド拡張メソッドを実装するクラスを指定するには、このキーワードを使用し
    「汚染」を回避するために、最小範囲の拡張メソッドを使用して、拡張メソッドは、近接の原則に従うべきで実装•

大規模な森林ネットワーク技術を見つけるために、プラットフォーム、サイト構築、ソフトウェア開発、システム運用・保守を、GPS!
http://cnsendnet.taobao.com
セン科学技術公式ブログから
http://www.cnsendblog.com/index.php/?p=476

おすすめ

転載: blog.51cto.com/14036626/2482943