8

関数がそのインターフェイスのみを受け入れる特定のインターフェイスを実装する関数にオブジェクトを渡すと、コストがかかりますか? お気に入り:

Change (IEnumerable<T> collection)

そして私は渡します:

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

それらはすべてIEnumerableを実装しています。しかし、それらのいずれかを Change メソッドに渡すと、それらは IEnumerable にキャストされるので、キャスト コストだけでなく、固有のメソッドが失われるなどの問題もありますか?

4

2 に答える 2

14

いいえ、以来、キャストは関与していませんList<T> IS-A IEnumerable<T>。これは、キャストを必要としないポリモーフィズムを使用しています。

編集:ここに例があります:

using System;
using System.Collections.Generic;

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

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

ILMainは次のとおりです。

.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直後に呼び出されます。

于 2009-02-27T17:27:57.123 に答える
0

コストがかかるとは思えません。型は既に IEnumerable を実装しているため、オブジェクトはすぐに使用できるはずです (これはほとんど推測であることに注意してください。CLR の vtables が実際に舞台裏でどのように機能するかについてはわかりません)。

コストがかかるとしても、そのコストは驚くほど小さいので、違いが生じる場合は、おそらく最初から CLR を使用するべきではありません。

于 2009-02-27T17:30:05.403 に答える