2009-02-27 7 views
8

関数がそのインターフェイスのみを受け付ける特定のインターフェイスを実装する関数にオブジェクトを渡すコストはありますか?C#インターフェイスの質問

Change (IEnumerable<T> collection) 

と私は渡す::のようなそれらのすべてがIEnumerableを実装し

List<T> 
LinkedList<T> 
CustomCollection<T> 

。しかし、それらのいずれかをChangeメソッドに渡すと、IEnumerableにキャストされるので、キャストコストがかかりますが、固有のメソッドなどを失う問題もあります。

+0

+1非常に興味深い質問! –

答えて

14

いいえ、List<T>IS-AIEnumerable<T>以降のキャストはありません。これは鋳造を必要としない多型を使用しています。

編集:ここでは一例です:Mainため

using System; 
using System.Collections.Generic; 

class Program 
{ 
    static void Main() 
    { 
     foo(new List<int>()); 
    } 

    static void foo(IEnumerable<int> list) { } 
} 

ILは、次のとおりです。

.method private hidebysig static void Main() cil managed 
{ 
    .entrypoint 
    .maxstack 8 
    L_0000: nop 
    L_0001: newobj instance void [mscorlib]System.Collections.Generic.List`1<int32>::.ctor() 
    L_0006: call void Program::foo(class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>) 
    L_000b: nop 
    L_000c: ret 
} 

そして、あなたは何の鋳造関係がありません見ることができますように。 List<T>のインスタンスがスタックにプッシュされ、すぐにfooが呼び出されます。

+0

さらに、オブジェクトのメソッドを "失う"こともなく、関数内では使用できません。このメソッドはIEnumerable しか期待していないため、このインターフェイスで使用できるメソッドのみを使用する必要があるため、これは問題ありません。 – tvanfosson

0

費用がかかりません。タイプは既にIEnumerableを実装しているので、オブジェクトはすぐに使用できるはずです(これは主に推測ですが、CLRのvtableが本当に背後でどのように機能するかはわかりません)。

費用がかかっている場合は、それほど驚くほど小さくなります。差があれば、CLRを使用しないでください。