gpt4 book ai didi

c#-4.0 - C#中动态和T的实际区别是什么

转载 作者:行者123 更新时间:2023-12-04 17:37:09 24 4
gpt4 key购买 nike

我读到了类型 dynamic在 C# 2010 中。(相应的 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));
}

我考虑过 this post但这并没有回答我的问题。

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

最佳答案

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

关于c#-4.0 - C#中动态和T的实际区别是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14810914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com