C#中的dynamic和T之间的实际区别是什么

Den*_*der 5 generics dynamic c#-4.0

我阅读了有关dynamicC#2010中的Type的信息。(对应的msdn条目)

我感到困惑的实际差别T,并dynamic同时开发的通用功能。我目前的测试并未显示使用dynamic的新方法,而使用则无法实现T。另外看来,动态技术在运行时需要更多的时间来完成相同的任务。

一些示例代码让我明白了:

// Sample Object
public class SampleObj
{
    public string Test { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的测试方法(也测量速度):

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();
}
Run Code Online (Sandbox Code Playgroud)

结果是:

Comparison T: False time: 6 ms
Comparison dynamic: False time: 3969 ms
Run Code Online (Sandbox Code Playgroud)

动态功能需要多少更多的时间相比,与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));
}
Run Code Online (Sandbox Code Playgroud)

我考虑了这篇文章,但这并没有解决我的问题。

有人可以告诉我,在什么情况下动态比T更有效?(希望有一个小的实际样本

Ham*_*yan 8

简短的答案是,泛型T必须在编译时就已知道,但动态是在运行时推断出来的。