在C#动态关键词表现?

cse*_*ruk 0 c#

如果使用动态关键字&我们分配一些类型,编译器执行装箱/解拳操作?例如;

dynamic myInstance=null;
object key="BankProject.Payment";
Type myType=ServiceCashe.GetType(key);//get desire type from cache...
myInstance=Activator.CreateInstance(myType); //instanciate myType
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

除非它是一个值类型,否则不会进行装箱 - 但是在您使用的代码示例中,无论如何都没有真正使用动态类型.到目前为止,您的代码相当于:

object key = "BankProject.Payment";
Type myType = ServiceCashe.GetType(key);
object myInstance = Activator.CreateInstance(myType);
Run Code Online (Sandbox Code Playgroud)

只有当您执行动态成员访问时才会这样 - 例如myInstance.SomeMethod(),动态类型实际上会生效.通常,避免这种情况的方法是使您正在获取的所有类型动态实现某些接口:

object key = "BankProject.Payment";
Type myType = ServiceCashe.GetType(key);
IPayment myInstance = (IPayment) Activator.CreateInstance(myType);
myInstance.SomeMethodInInterface();
Run Code Online (Sandbox Code Playgroud)

然后,唯一的 "动态"部分是创建实例,然后是强制转换中的执行时间检查.

与往常一样,如果您有性能问题,您应该在实际情况下根据明确定义的目标来衡量它们.即使这确实执行了装箱和拆箱,我们也不知道这是否是您上下文中的重要成本.(碰巧的是,拳击和拆箱比我的经验便宜得多Activator.CreateInstance......)