C#中 Var 和 dynamic 整理介绍

常有人会拿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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值