2

拡張メソッドを含む VB.NET で書かれたライブラリがあります。VB.NET には、私の意見では、拡張メソッドの概念とは相容れない 2 つの特徴があります。

  • 拡張メソッドはモジュールで宣言する必要があります ( Extension Methods )
  • すべてのモジュール メンバーは名前空間スコープにあります ( Type Promotion )

これは、拡張メソッドが常に名前空間レベルでアクセスできるか、まったくアクセスできないことを意味します。これは意味がありません。スコープは、概念的には名前空間ではなく、拡張する型であるためです。

メソッドが拡張として宣言されているという事実は、その命名に影響を与えます。なぜなら、グローバル ユーティリティ メソッドには のような型が含まれる可能性がありますがGetDictionaryValueOrNull、拡張メソッドは、それが型GetValueOrNullに対して宣言されていることがすでに明確である必要があるためDictionaryです。拡張メソッドがグローバルな場合、これは混乱を招く可能性があります: メソッドを持つ (辞書ではない) クラスにいるとしGetValueます。「GetValue」と入力すると、Visual Studio は「GetValue」と「GetValueOrNull」の両方を一覧表示し、現在のクラスが両方の操作をサポートしているかのように表示します。

これに対する解決策はありますか(「C#で書く」以外)? モジュールを非グローバルとしてマークすることはできますか、または少なくとも Visual Studioが実際に拡張メソッドとして検索されている場合にのみ拡張メソッドを表示するように強制することはできますか?

Visual Studio User Voice での提案: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4228049-include-an-option-to-disable-the-promotion-of-scop

4

2 に答える 2

0

私は最近、すべての拡張メソッドを名前空間*.Extensionsに移動しました。ここで、拡張対象が属する*名前空間は何でもあります。これは BCL 型でも機能し、必要な拡張機能のみをインポートしながら、雑然としたインテリセンスを回避できます。

ユーティリティ関数と拡張メソッドを区別するための唯一の提案は、それが拡張メソッドであることを示す xml コメントを追加することです。

''' <summary>(extension) If the dictionary contains the specified key: return its value; otherwise null.</summary>
于 2013-07-23T19:47:56.117 に答える