7

先日、C# Boolean 構造体のメタデータを見ていました。

Boolean はインターフェイス IConvertible を実装します。しかし、Boolean のメンバーを見ると、ほとんどの IConvertible メンバーが見えませんでした。

独自のクラスを作成するなど、何人かの同僚といくつかのテストを行い、IConvertible を Boolean 用に明示的に実装する必要があるという結論に達しました。

問題は、なぜそれらが表示されないのかということです。「設計上の決定」である可能性があることは理解していますが、メタデータを検査しているすべての人に表示されると、より大きな価値が追加されることを理解しています.

テストは VS2010 .NET4.0 で行われました

4

4 に答える 4

6

その理由は、これらのメソッドは I インターフェースを実装するためだけに存在し、クラスのパブリック インターフェースを拡張するためではないからです。

つまり、次の場合です。

public class MyClass : IConvertible
{
 // implementation
}

実際、MyClass を変換可能にしたい場合は、その参照を IConvertible を期待するメソッドに渡すことができます。

public void DoSomethingWithConvertible(IConvertible conv)

ただし、型 MyClass の変数で Convert メソッドを公開したくない場合があります。MyClass のパブリック インターフェイスにそのメソッドを持たせたくない場合は、インターフェイスを明示的に実装します。それがアプローチの全体的な考え方です。これは、以下が許可されていないことを意味します。

MyClass a = new MyClass();
a.Convert();

ただし、次のことは引き続き許可されます。

MyClass a = new MyClass();
((IConvertible)a).Convert();

この背後にある全体的な考え方は、まったく同じインスタンスを使用しているにもかかわらず、MyClass にはメソッドがないということです。A as IConvertible にはメソッドがあります。インスタンスが分割されたパーソナリティを持つことを許可しているかのように考えてください。

通常、すべてのインターフェースの実装を暗黙のうちに終了します。ただし、上記の理由により、明示的に実装する非常に特殊な状況があります。

ところで、素晴らしい質問をありがとう!

于 2011-09-01T10:06:48.147 に答える
2

明示的なインターフェイスの実装は実際には実装を隠しているためです。

于 2011-09-01T09:55:12.500 に答える
2

メタデータは実際に明示的に実装された を示しています。メタデータではなく、インテリセンスのことですか?

これは設計によるものであり、ブール値の開発者がインターフェイスをサブセットに制限するのに役立ちます。推奨される使用を制限することで、異常な使用と見なされるものも可視化されます。たとえば、ブール値を特定の数値として表示することは一般的に推奨されていませんが、特定のケースでは、とにかくそれを行うことができると便利です。

IDictinary<T,K>は別の例です。IEnumerable<KeyValuePair<T,K>>コレクション内のすべてのペアと を反復処理できるように実装しICollation<KeyValuePair<T,K>>ます。したがって、KeyValuePair を指定して辞書で Add を呼び出すことができますが、通常は使用する必要がありますAdd(K, key, T Value)

メタデータへの読み取りアクセスを提供するツールを使用して、クラスを調べてみてください。1 つは ILDASM であり、明示的に実装されたメソッドのメタデータを実際に見つけることができます。

于 2011-09-01T10:00:55.507 に答える
-1

これらは明示的に実装されています。実装されているすべてのコンバータブルは、http: //msdn.microsoft.com/en-us/library/system.boolean.aspxで見つけることができます。

于 2011-09-01T09:49:13.267 に答える