常有人会拿var这个关键字来和dynamic做比较。实际上,var和dynamic完全是两个概念,根本不应该放在一起做比较。var实际上是编译期抛给我们的“语法糖”,一旦被编译,编译期会自动匹配var 变量的实际类型,并用实际类型来替换该变量的申明,这看上去就好像我们在编码的时候是用实际类型进行申明的。而dynamic被编译后,实际是一个object类型,只不过编译器会对dynamic类型进行特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期。
以var声明的变量,支持“智能感知”,因为visual studion能推断出var类型的实际类型,而以dynamic声明的变量却不支持“智能感知”
Var的使用:
1.var只能作为局部变量,不能作为全局变量、静态变量
2.定义时必须初始化,因为编译时要推断类型
3.初始化时不能为NULL
4.声明后不能是更改类型
5.编译时要能确认类型
使用场合
1.隐式变量: 例如 var x=1;var y = "abd";(定义时必须初始化,"var"起到占位符作用,编译时会编译器会推断类型并替换"var")
2.匿名类:
var cls = new {name="james",sex=0,age=18};
var cls2 = new {name="john",sex=1,age=35};
var
cls3 = new {name=123, sex = "男", age = 34}
cls.GetType()
== cls2.GetType() == cls3.GetType() 结果都是返回true. 因为编译器只创建了一个泛型类.
var
cls4 = new {sex=1,name=‘admin‘,age=24}
cls.GetType()
== cls2.GetType() 结果返回false,名称一致,但是顺序不一致时,编译器则会创建新的泛型类
注:匿名类不能有方法
dynamic是FrameWork4.0的新特性。dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性。比如,即使你对GetDynamicObject方法返回的对象一无所知,你也可以像如下那样进行代码的调用,编译器不会报错:
dynamic变量是一个object变量!
类型转换
Dynamic类型的实例和其他类型的实例间的转换是很简单的,开发人员能够很方便地在dyanmic和非dynamic行为间切换。任何实例都能隐式转换为dynamic类型实例,见下面的例子:
dynamic d1 = 7;
dynamic d2 = "a string";
dynamic d3 = System.DateTime.Today;
dynamic d4 = System.Diagnostics.Process.GetProcesses();
Conversely, an implicit conversion can be dynamically applied to any expression of type dynamic.
反之亦然,类型为dynamic的任何表达式也能够隐式转换为其他类型。
int i = d1;
string str = d2;
DateTime dt = d3;
System.Diagnostics.Process[] procs = d4;
方法中含有dynamic类型参数的重载问题
如果调用一个方法是传递了dynamic类型的对象,或者被调用的对象是dynamic类型的,那么重载的判断是发生在运行时而不是编译时。
动态语言运行时(dynamic language runtime DLR)
动态语言运行时是.NET Framework 4 Beta 1中的一组新的API,它提供了对c#中dynamic类型的支持,也实现了像IronPython和IronRuby之类的动态程序设计语言。
dynamic可以简化反射。
public class TestClass()
{
public
string Name{get;set;}
public
int Add(int a,int b){return a+b;}
}
反射:
var asm = Assembly.LoadFile(@"c:/test.dll");
var type =
asm .GetType("TestClass");//如果有命名空间,加上命名空间
var instance = asm.CreateInstance("TestClass");
type.GetProperty("Name").SetValue(instance,"My Name"); //给属性设置值
var string = type.GetProperty("Name").GetValue(instance);
var method = type.GetMethod("Add");
object[] para = {1,2};
var ret = (int) method.Invoke(instance,para);
使用 dynamic:
dynamic dy= new TestClass();
var ret =
dy.Add(1,2);