6

dynamicC# 2010 のType について読みました (対応するmsdnエントリ) 。

ジェネリック関数の開発中のTとの実際的な違いについて混乱しています。dynamic私の現在のテストでは、ウェイを使用する新しい方法は示されませんdynamicでした。これは では不可能Tです。さらに、そのダイナミックは同じタスクを達成するために実行時にはるかに多くの時間を必要とするようです。

私の主張を明確にするためのいくつかのサンプルコード:

// Sample Object
public class SampleObj
{
    public string Test { get; set; }
}

私のテスト方法(速度も測定):

static void Main(string[] args)
{
    var sampleObj1 = new SampleObj { Test = "Test1" };
    var sampleObj2 = new SampleObj { Test = "Test2" };

    Stopwatch c1 = Stopwatch.StartNew();
    bool res1 = CompareObjectsT<SampleObj>(sampleObj1, sampleObj2);
    c1.Stop();
    Console.WriteLine("Comparison T: {0} time: {1} ms", res1, c1.ElapsedMilliseconds);


    Stopwatch c2 = Stopwatch.StartNew();
    bool res2 = CompareObjectsDyna(sampleObj1, sampleObj2);
    Console.WriteLine("Comparison dynamic: {0} time: {1} ms", res2, c2.ElapsedMilliseconds);
    c2.Stop();

    var instance = new X<SampleObj>();

    Console.ReadLine();
}

結果は次のとおりです。

Comparison T: False time: 6 ms
Comparison dynamic: False time: 3969 ms

動的関数は、T 比較と比較して、はるかに多くの時間を必要とします。

テスト アプリケーションを逆コンパイルすると、リフレクションが大量に使用されていることがわかり、この膨大な時間がかかる可能性があります。

private static bool CompareObjectsDyna([Dynamic] object source1, [Dynamic] object source2)
{
    if (<CompareObjectsDyna>o__SiteContainer2.<>p__Site3 == null)
    {
        <CompareObjectsDyna>o__SiteContainer2.<>p__Site3 = CallSite<Func<CallSite, object, bool>>.Create(Binder.Convert(CSharpBinderFlags.None, typeof(bool), typeof(Program)));
    }
    if (<CompareObjectsDyna>o__SiteContainer2.<>p__Site4 == null)
    {
        <CompareObjectsDyna>o__SiteContainer2.<>p__Site4 = CallSite<Func<CallSite, Type, object, object, object>>.Create(Binder.InvokeMember(CSharpBinderFlags.None, "Equals", null, typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.IsStaticType | CSharpArgumentInfoFlags.UseCompileTimeType, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) }));
    }
    return <CompareObjectsDyna>o__SiteContainer2.<>p__Site3.Target(<CompareObjectsDyna>o__SiteContainer2.<>p__Site3, <CompareObjectsDyna>o__SiteContainer2.<>p__Site4.Target(<CompareObjectsDyna>o__SiteContainer2.<>p__Site4, typeof(object), source1, source2));
}

この投稿を検討しましたが、これは私の質問に答えていません。

ダイナミックが T よりもはるかに効果的なシナリオはどれですか? (うまくいけば、小さな実用的なサンプルで

4

1 に答える 1

10

簡単な答えは、ジェネリック型 T はコンパイル時に認識されている必要がありますが、動的は実行時に推論されるということです。

于 2013-02-11T11:10:34.447 に答える