1.var与dynamic的区别

    C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,但其实它们是有本质的区别的。var 在编译阶段已经确定类型,在初始化时候,必须提供初始化的值,而dynamic则可以不提供,它是在运行时才确定类型。

 static void Main(string[] args)
{
//var 在编译阶段已经确定类型
var number = ; //dynamic在编译期间不进行任何的类型检查,而是将类型检查放到了运行期
dynamic dyn = ; dyn = "hello world"; //runtime eror
//字符串没有 "fn不存在的方法" 的方法,但在语法检查时通过,不会提示语法错误
var s = dyn.fn不存在的方法(); Console.ReadKey();
}

2.ExpandoObject类型的使用

当我们因为某种目的而需要创建一些临时类型的变量时,我们可以会像下面这样做:

 var a = new { Name = "Paul Huang", Age =  };
Console.WriteLine("Name is {0},Age is {1}", a.Name, a.Age);

现在要介绍一种新的类型ExpandoObject,它是专为动态行为而设计的类型,用法如下:

 static void Main(string[] args)
{
dynamic a = new ExpandoObject();
a.Name = "Paul Huang";
a.Age = ;
Console.WriteLine("Name is {0},Age is {1}", a.Name, a.Age);
}

实际上,ExpandoObject类显式实现了 IDictionary<string,object> 接口,所以,我们可以知道,其实它里面就是用一个字典来存储动态赋值的数值的,键的类型为字符串,表示属性名;值的类型为object,表示任何类型。

咱们把它里面的字典数据输出来:

 IDictionary<string, object> dic = a as IDictionary<string, object>;
foreach (var pv in dic)
{
Console.WriteLine("Key = {0} , Value = {1}", pv.Key, pv.Value);
}

所以不管你如何动态设置属性,它都可以进行解析,就是这个原因,里面用一个字典来负责存取数据。

3.dynamic在反射时的应用

  由于dynamic在运行时才检查类型,所以有时候会出现错误,因此使用它必须得法,那么何时使用它比较方便呢?我们先定义一个Person类,然后用反射进行动态调用起Talk方法:

 class Person
{
public void Talk(string msg)
{
Console.WriteLine(msg);
}
}
 class Program
{
static void Main(string[] args)
{
Type t = typeof(Person);
Object obj = Activator.CreateInstance(t);
t.InvokeMember("Talk", BindingFlags.InvokeMethod, null, obj, new object[] { "hello world" });
Console.ReadKey();
}
}

在反射的时候,传统的方法调用往往比较繁琐,而用dyanmic则非常简化,而且直观:

 class Program
{
static void Main(string[] args)
{
Type t = typeof(Person);
dynamic obj = Activator.CreateInstance(t);
obj.Talk("hello world");
Console.ReadKey();
}
}

转载链接:https://www.cnblogs.com/JustYong/p/5113197.html

Var与Dynamic的区别的更多相关文章

  1. 简述C#中关键字var和dynamic的区别

    C#中关键字var和dynamic的区别如下: 1.var申明的变量必须初始化,dynamic申明的变量无需初始化. 2.var关键字只能在方法内部申明局部变量,dynamic关键字可用于局部变量,字 ...

  2. var, object, dynamic的区别以及使用(转载)

    var, object, dynamic的区别以及使用 阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 拿这三者比较的原因 ...

  3. var, object, dynamic的区别以及dynamic的使用

    var, object, dynamic的区别以及dynamic的使用 理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用 2013-06- ...

  4. var, object, dynamic的区别以及使用

    var, object, dynamic的区别以及使用 阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 拿这三者比较的原因 ...

  5. var和dynamic的区别及如何正确使用dynamic ?

    C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,他们都可以申明动态类型的变量,但是本质上他们还是有不少区别的.var 在编译阶段已经确定类型,在初始化时候,必须提供初始化的值, ...

  6. C#4.0中var和dynamic的区别

    1. var表示“变量的类型是在编译时决定的”, var让你在初始化变量时少输入一些字,编译器会根据右值来推断出变量的类型, var只能用于局部变量的定义,你不能把类的属性定义成 var,也不能把方法 ...

  7. var和dynamic的区别

    1.var 1.均是声明动态类型的变量. 2.在编译阶段已经确定类型,在初始化的时候必须提供初始化的值. 3.无法作为方法参数类型,也无法作为返回值类型. 2.dynamic 1.均是声明动态类型的变 ...

  8. 理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用

    阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 一. 为什么是它们三个? 拿这三者比较的原因是它们在使用的时候非常相似.你 ...

  9. var object dynamic的区别

    一.var var本身不是一种类型,只是一种语法糖:var声明的变量在赋值的时候即已决定其变量类型,编译时会进行校验. 二.object object是所以类型的基类,故可以赋任何类型的值. 三.dy ...

随机推荐

  1. “全栈2019”Java多线程第十八章:同步代码块双重判断详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  2. BZOJ3775: 点和直线(计算几何+拉格朗日乘数法)

    题面 传送门 题解 劲啊-- 没有和\(Claris\)一样推,用了类似于\(Shinbokuow\)推已知点求最短直线的方法,结果\(WA\)了好几个小时,拿\(Claris\)代码拍了几个小时都没 ...

  3. BZOJ 4517--[Sdoi2016]排列计数(乘法逆元)

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1727  Solved: 1067 Description ...

  4. MySQL中需要注意的几点

    几个常用的命令: select  database(); #查看当前所在的数据库. select  user();#查看当前登录的用户 show global variables like " ...

  5. Android之AppWidget

    1.Widget设计步骤 需要修改三个XML,一个class: 1)第一个xml是布局XML文件(如:main.xml),是这个widget的.一般来说如果用这个部件显示时间,那就只在这个布局XML中 ...

  6. ios实现fastlane自动化打包

    终于抽出时间来学习自动化打包了,app在测试阶段一天总会经历好几次的打包,每次打包真是身心疲惫,刚打完的包说不定就被测试妹子反应还要微调什么地方,我就真的有气没法出,打一次包怎么也得浪费十几分钟,还不 ...

  7. POJ 1056

    #include <iostream> #include <string> #define MAXN 50 using namespace std; struct node { ...

  8. 2018春招-今日头条笔试题-第一题(python)

    题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 要想得到输入的数字列中存在相隔为k的数,可以将输入的数字加上k,然后判断其在不在输入的数字列中即可. #-*- cod ...

  9. ruby部署之Heroku

    下载安装 :https://devcenter.heroku.com/articles/heroku-cli  (我是windows,所以我下载windows) cmd黑窗口输入: $ heroku ...

  10. ActiveMQ开发注意要点

    目录1.如何保证消息的成功处理2.避免消息队列的并发3.消息有效期的管理4.过期消息,处理失败的消息如何处理 1.保证消息的成功处理消息发送成功后,接收端接收到了消息.然后进行处理,但是可能由于某种原 ...