无意中在官网看到这篇说明,觉得非常准确,权威,恍然大悟的感觉,特意敲了一遍代码,
先说结论:
dynamic
类型与 object
的不同之处在于,编译器不会对包含类型 dynamic
的表达式的操作进行解析或类型检查。 编译器将有关该操作信息打包在一起,之后这些信息会用于在运行时评估操作。 在此过程中,dynamic
类型的变量会编译为 object
类型的变量。 因此,dynamic
类型只在编译时存在,在运行时则不存在。
如何证明这件事如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DynamicAndObject
{
class Program
{
static void Main(string[] args)
{
//Demo1();
ExampleDemo ed = new ExampleDemo();
//编译即报错,提示没有两个参数的方法
//ed.TestMethod(2,10);
dynamic ded = new ExampleDemo();
//这里编译通过,但运行会报错
ded.TestMethod(2, 10);
}
public static void Demo1() {
dynamic dyn = 1, dyn2 = 1;
object obj = 1;
System.Console.WriteLine(dyn.GetType());
System.Console.WriteLine(obj.GetType());
dyn = dyn + 3;
dyn2 = dyn2 + "3";
//obj = obj + 3;
//报错,非常明显看出obj会在编译时,便进行检查
Console.WriteLine(dyn);
Console.WriteLine(dyn2);
/*
input:
System.Int32
System.Int32
4
13
请按任意键继续. . .
非常清晰看出,dynamic变量的方便灵活之处,
*/
}
class ExampleDemo
{
public static dynamic field;
public dynamic MyProperty { get; set; }
public dynamic TestMethod(dynamic d) {
dynamic var1 = "flag1";
int var2 = 2;
if (d is int)
{
return var2;
}
else {
return var1;
}
}
}
}
}
再次也说明,编译器会开启类型检查,方法参数是否一致检查。