C#-动态类型还是类型转换?

C#-动态类型还是类型转换?,c#,performance,dynamic,C#,Performance,Dynamic,谈到性能,C#中什么更好?使用动态类型还是类型转换 像这样(只是一个例子,不是真正的实现): var list=newlist(); 添加(新女性()); 列表。添加(新男性()); 列表。添加(新车()); ....... 在另一个代码中。。。。 var men=(men)列表[1]; 男人。一些男人方法(); 还是这个 var list = new List<dynamic>(); list.Add(new Woman()); list.Add(new Men()); list

谈到性能,C#中什么更好?使用动态类型还是类型转换

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

var list=newlist();
添加(新女性());
列表。添加(新男性());
列表。添加(新车());
....... 在另一个代码中。。。。
var men=(men)列表[1];
男人。一些男人方法();
还是这个

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();
var list=newlist();
添加(新女性());
列表。添加(新男性());
列表。添加(新车());
....... 在另一个代码中。。。。
var men=列表[1];
男人。一些男人方法();

这个例子是精心设计的,正如您所知,列表[1]是一个
男人
。所以在这种情况下,两者都是相同的

当您不知道确切的类型,但您知道在运行时它将有一个
SomeMethod
或属性时,dynamic变得非常有用

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


var-men=(men)列表[1]行,而后者在
men.SomeMenMethod()上抛出异常

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

如果这是不可能的,则强制转换更好,因为它更清晰、更安全(编译器可以检查
Men
是否确实有
SomeMenMethod
),发生错误时的异常更清晰,并且不会意外工作(如果你认为你有
男人
,但实际上你有
女人
,这实现了相同的方法,它是有效的,但可能是一个bug)

你问的是绩效。除了你之外,没有人能真正了解你的具体案例的绩效。如果你真的关心绩效,请始终从两个方面来衡量


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

对其进行分析以找出原因。编写一些同时调用该方法一百万次的代码,然后但我怀疑有两件事:1)您可能可以重写代码,以便知道列表中的对象类型,从而不需要强制转换;2)性能差异可以忽略不计。
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();