C#中的Var与dynamic

后期再写写NetCoreWebApi方面的,今天换个"口味"

var和dynamic类型表面上非常相似,但是实际上是非常不同的:

  • var - 让编译器去确定类型;

  • dynamic  - 让运行时确定类型;

例如:

  •  
  •  
  •  
  •  
  •  
  •  
            dynamic x = "hello";            var y = "hello";            //这里编译器不会报错,程序运行报错            int i = x;            //这里编译器会报错            int j = y;

但是一个由var声明的变量的静态类型可以用dynamic:

  •  
  •  
  •  
  •  
  •  
  •  
            dynamic x = "hello";            // 这里 y 会被认为是dynamic类型            var y = x;            // 运行时会出错            int z = y;


常见的应用场景:

  1. 在后台接收对象,如微信小程序授权参数传到我们后台,可以使用dynamic类型接收此参数,比较方便不用自己去做json对象处理:

  •  
  •  
  •  
  •  
  •  
  •  
        [HttpPost]        public  async Task<IActionResult>                      DoLogin([FromBody]dynamic data){                      // data为传过来的数据 这里做逻辑处理                        }

 

     2.快速创建一个临时对象,比如User类,里面有Name与Age属性,通常做法可能是创建类然后写属性,但是也可以试试下面的方式:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
   var UserA= new { Name = "Huang", Age = 18 };   Console.WriteLine($"Name is {UserA.Name},Age is {UserA.Age}");
    dynamic userB = new ExpandoObject();    userB.Name = "Huang";    userB.Age = 18;    Console.WriteLine($"Name is {userB.Name},Age is {UserA.Age}");

ExpandoObject类实现了 IDictionary<string,object> 接口其实它里面就是用一个字典来存储动态赋值的数值的,键的类型为字符串,表示属性名;值的类型为object,表示任何类型;

 

       3.反射的中用到dynamic也比较多,比如我们要调用下面类中方法:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
namespace ClassLibrary{  public class Demo  {    public string GetName()    {      String name = "dddd";      return name;    }  }}

通常情况下调用:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
static void Main(string[] args){  Type typeinfo = Assembly.Load("ClassLibrary").GetType("ClassLibrary.Demo");  object instance = Assembly.Load("ClassLibrary").CreateInstance("ClassLibrary.Demo");  MethodInfo me = typeinfo.GetMethod("GetName");  object ret = me.Invoke(instance, null);  Console.WriteLine(ret.ToString());}

使用dynamic处理下调用:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
class Program{  static dynamic reflectObj = null;
  static void Main(string[] args)  {    if (reflectObj == null)    {      reflectObj = Assembly.Load("ClassLibrary").CreateInstance("ClassLibrary.Demo");    }    object obj= reflectObj.GetName();    Console.WriteLine(obj.ToString());    Console.ReadKey();  }}

但是dynamic也不完全是好的,通常运行时的绑定会对程序性能有些影响,如果编译时函数名称确定,对象类型在编译时也确定,那就既不需要反射也不需要dynamic。  喜欢就点个赞~  

原文地址:https://mp.weixin.qq.com/s/JrRHw7zmMwddL1d0qMJmAA

 

关注公众号  发现更多资源

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值