C# - 动态类型还是Typecast?

时间:2011-08-28 00:46:03

标签: c# performance dynamic

谈论性能,C#有什么好处?使用动态类型还是Typecast?

像这样(只是一个例子,而不是真正的实现):

var list = new List<object>();
list.Add(new Woman());
list.Add(new Men());
list.Add(new Car());
....... in another code ....
var men = (Men)list[1];
men.SomeMenMethod();

或者这个

var list = new List<dynamic>();
list.Add(new Woman());
list.Add(new Men());
list.Add(new Car());
....... in another code ....
var men = list[1];
men.SomeMenMethod();

2 个答案:

答案 0 :(得分:1)

如你所知,列表[1]是Men,这个例子是设计的。所以在这种情况下要么是相同的。

如果动态在您不知道精确类型的情况下变得有用,但您确实知道在运行时它将具有SomeMethod或属性。

当然,如果类型假设错误,那么第一个会在

上抛出异常

var men = (Men)list[1];行,而后者则在men.SomeMenMethod();

上抛出异常

答案 1 :(得分:0)

如果可能,请不要使用其中之一。尝试使用不涉及强制转换的类型安全解决方案或dynamic

如果那是不可能的,那么转换更好,因为它更清晰,更安全类型(编译器可以检查Men实际上是否有SomeMenMethod),错误情况下的异常更清晰并且它不会偶然工作(如果你认为你有Men,但你实际上有Woman,它实现了相同的方法,它可以工作,但它可能是一个错误)。

你问过性能。除了你之外,没有人能够真正了解你的具体案例的表现。如果您真的关心表现,请始终以两种方式衡量。

但我的期望是dynamic会慢得多,因为它必须在运行时使用类似迷你编译器的东西。它尝试在首次运行后缓存结果,但它仍然很可能不会比强制转换更快。