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. 经典贪心算法(哈夫曼算法,Dijstra单源最短路径算法,最小费用最大流)

    哈夫曼编码与哈夫曼算法 哈弗曼编码的目的是,如何用更短的bit来编码数据. 通过变长编码压缩编码长度.我们知道普通的编码都是定长的,比如常用的ASCII编码,每个字符都是8个bit.但在很多情况下,数 ...

  2. python stdout 重定向

    import sys class Buffer(object): def __init__(self): self.buffer = [] def write(self, *args, **kwarg ...

  3. 00-python概述。

    人生苦短,我用Python. -发展历史: - 1989年,由Guido van Rossum开始开发, - 1991年,发布第一个公开发行版,第一个Python编译器(同时也是解释器)诞生. - 2 ...

  4. 在阿里云服务器中安装配置mysql数据库完整教程

    阿里云ECS服务器CentOS7上安装MySql服务 (可选)1.确保服务器系统处于最新状态 [root@localhost ~]# yum -y update如果显示以下内容说明已经更新完成 Rep ...

  5. Nginx Web服务(一)

    一.Nginx原理介绍 1.1:什么是Nginx Nginx是一个开源的,支持高性能.高并发的WWW服务和代理服务软件 1.2:Nginx的功能特点及应用场合 ① 支持高并发:能支持几万并发连接,特别 ...

  6. js的事件学习笔记

    目录 0.参考 1.事件流 冒泡传播 事件捕获 2.事件绑定--onclick接口 onclick类的接口,只能注册一个同类事件 onclick类的接口,使用button.onclick = null ...

  7. 探索DatePicker新用法

    很少用DatePicker,项目需要用到DatePicker,再用时发现跟以前有些变化,重新简单梳理一下DatePicker的用法. 先上效果图: 首先是xml文件的用法: 以前是用android:s ...

  8. Eclipse及IDEA插件开发

    https://github.com/eclipse/eclipse.jdt.ui http://www.eclipse.org/jdt/ui/ https://www.cnblogs.com/xin ...

  9. IntelliJ IDEA使用心得之非Maven项目篇

    今天和大家分享下非Maven项目在IDEA中的配置方法,由于非Maven项目的配置方法基本相同,所以此篇只对不同点进行说明. 1.声明依赖库 我们可以使用库的方式来添加项目依赖,这是一个非常好的实践. ...

  10. java HashMap源码分析(JDK8)

    这两天在复习JAVA的知识点,想更深层次的了解一下JAVA,所以就看了看JAVA的源码,把自己的分析写在这里,也当做是笔记吧,方便记忆.写的不对的地方也请大家多多指教. JDK1.6中HashMap采 ...