c# dynamic 学习

来源:互联网 发布:安娜科穆宁 知乎 编辑:程序博客网 时间:2024/06/04 22:02
网上也有多资料是关于 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, 但是还是有区别,各有各的特点.