2013-02-11 2 views
1

Я прочитал о Тип dynamic в C# 2010 (соответствующий msdn вход)Каково практическое различие между динамическим и T в C#

Я смущен о практической разницы между 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 

Необходимы динамические функции много больше времени, по сравнению с сравнением Т.

Декомпиляция мое тестовое приложение показывает тяжелое использование отражения, которое может привести к этому огромное количество времени:

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)); 
} 

Я считал this post, но это не ansered мой вопрос.

Может кто-нибудь сказать мне, в каком сценарии динамика намного эффективнее, чем T? (надеяться, с небольшим практическим образцом)

ответ

3

Короткий ответ в том, что общий тип Т должен быть известен во время компиляции, но динамического выводится во время выполнения.

Смежные вопросы