天天看点

c# dynamic 学习

网上也有多资料是关于 C# dynamic的,这里自己总结下.

首先 和 var 关键字比较下,程序一旦被编译,编译期会自动匹配var 变量的实际类型.

var 有 四个特点:

1. 必须在定义时初始化。也就是必须是var s = “abcd”形式,而不能是如下形式:

var s;

s = “abcd”;

2. 一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。

3.   var要求是局部变量。

4.   使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样。

而dynamic被编译后,实际是一个object类型,只不过编译器会对dynamic类型进行特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期

dynamic d1 = 7;

dynamic d2 = "a string";

dynamic d3 = System.DateTime.Today;

int i = d1;

string str = d2;

DateTime dt = d3;

方法中含有dynamic类型参数的重载问题

如果调用一个方法是传递了dynamic类型的对象,或者被调用的对象是dynamic类型的,那么重载的判断是发生在运行时而不是编译时。

动态语言运行时(dynamic language runtime DLR)

动态语言运行时是.NET Framework 4 Beta 1中的一组新的API,它提供了对c#中dynamic类型的支持,也实现了像IronPython和IronRuby之类的动态程序设计语言。

dynamic可以简化反射。

以前我们这样使用反射:

public class DynamicSample

{

public string Name { get; set; }

public int Add(int a, int b)

{

return a + b;

}

}

DynamicSample dynamicSample = new DynamicSample(); //create instance为了简化演示,我没有使用反射

var addMethod = typeof(DynamicSample).GetMethod("Add");

int re = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });

现在,我们有了简化的写法:

dynamic dynamicSample2=new DynamicSample();int re2= dynamicSample2.Add(1,2);

参考链接:http://www.cnblogs.com/qiuweiguo/archive/2011/08/03/2125982.html

有点 类似QT中 qvariant, 但是还是有区别,各有各的特点.