例如,如果实例方法exampleMethod1
只有一个参数,则编译器会识别出对方法的第一次调用,ec。 exampleMethod1(20, 4)
无效,因为它包含两个参数。
该调用导致编译器错误。编译器不会检查对方法dynamic_ec.exampleMethod1(10, 4)
的第二次调用,因为dynamic_ec
的类型是动态的。因此,不会报告编译器错误。
那么编译时检查和运行时检查之间的区别和使用动态类型的优势是什么?
答案 0 :(得分:3)
动态类型对于与其他语言或框架(如python,javascript)的互操作性非常有用。
如果没有动态,你必须依靠反射来获取对象的类型并访问其属性和方法。语法有时难以阅读,因此代码难以维护。在这里使用动态可能比反射更容易,更方便。
Anders Hejlsberg在PDC08给出了一个很好的例子:
object calc = GetCalculator();
Type calcType = calc.GetType();
object res = calcType.InvokeMember(
"Add", BindingFlags.InvokeMethod,
null, new object[] { 10, 20 });
int sum = Convert.ToInt32(res);
该函数返回一个计算器,但系统在编译时不知道该计算器对象的确切类型。代码唯一依赖的是该对象应该具有Add方法。
使用dynamic关键字,此代码看起来就像这个简单:
dynamic calc = GetCalculator();
int sum = calc.Add(10, 20);
答案 1 :(得分:0)
只有在不关心性能的时候才应该使用动态(正确的方法是通过反射api来完成的,但是当你不关心运行时错误时)。 如果您确实想要使用动态调用但不想冒险表现性能,可以使用从参数类型到正确方法的缓存自己实现它。 有一种方法可以在我重新绑定时找到正确的方法。