「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>.NET開発]]

* 目次 [#j29502d3]
#contents

*概要 [#rd5cb091]
クラスライブラリ、フレームワーク開発に使用されつつあるので少々調査。

*詳細 [#ff0aec4f]
-新規の派生型の作成、再コンパイル、または元の型の変更を行うことなく既存の型にメソッドを "追加" できる。
-拡張メソッドは特別な種類の静的メソッドですが、拡張された型のインスタンス メソッドのように呼び出せる。

**定義と利用 [#g626879f]
データ列に対するパイプラインやメソッドチェーンを、~
後付けで実装するようなユースケースに最も適合する。

***定義側 [#ibcc4ce7]
-staticクラスのstaticメソッドの第1引数の前に this を付ける。
-同じ名前空間内に2つ以上同名の拡張メソッドを定義できない。

***利用側 [#f84bf0e8]
-インスタンス・メソッドと同じ書き方をする(第1引数にthis的にアクセス可能)。
-同名の拡張メソッドが定義されている名前空間を同時に using できない。

**注意 [#b457e579]
便利なだけに、フツーに考えた範囲で問題ありそう。

-名前空間をusing(Imports)しないと拡張メソッドがIDE上に見えてこない。
--個人的には、名前空間が違うと、usingしないと拡張メソッドがIDE上に見えてこないのが辛いと思った。
--拡張メソッドは対象とする型の提供者以外は作成するべきではありません - よねKENのプログラミング研究~
http://d.hatena.ne.jp/yone-ken/20090304/p1

-衝突が起きると、対応策が少々アレ。~
https://twitter.com/openhishopjpo/status/1086149348109373440
--再定義または削除により、曖昧さを取り除く。
--一方の名前空間だけusing(Imports)で取り込む。
--両方の名前空間が必要な場合は、完全修飾クラス名によって単純に静的クラス呼び出しする。
--両方の名前空間が必要な場合は、完全修飾クラス名によって単純に静的クラス呼び出しする。~
同じ名前空間内に将とするメソッドが定義されていると、当然、拡張メソッドとして使ものにならなくなる。

**その他 [#s71caf73]
構造体、インターフェイス、enumに対しても適用可能。

*参考 [#z589a823]
-拡張メソッド (C# プログラミング ガイド) | Microsoft Docs~
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/extension-methods
-拡張メソッド - C# によるプログラミング入門 | ++C++; // 未確認飛行 C~
https://ufcpp.net/study/csharp/sp3_extension.html
-拡張メソッドを作成するには?[C#/VB]:.NET TIPS - @IT~
http://www.atmarkit.co.jp/ait/articles/1711/22/news030.html

----
Tags: [[:プログラミング]], [[:.NET開発]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS