标签:.net
常有人会拿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可以简化反射。
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);
标签:.net
原文地址:http://blog.csdn.net/dzta831121/article/details/43016537