Dynamic和Var的区别及dynamic使用详解

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

1.var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型。

2.var只能用于声明方法内部的局部变量,而dynamic可用于局部变量,字段,参数。

3.表达式不能转型为var,但能转型为dynamic。

4.必须显式初始化用var声明的变量,但无需初始化用dynam声明的变量。

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

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

class Person
{
public void Talk(string msg)
{
MessageBox.Show(msg);
}
} 
//dynamic 在反射时候可以简化代码
System.Type t = typeof(Person);
var obj = Activator.CreateInstance(t, null);
t.InvokeMember("Talk", System.Reflection.BindingFlags.InvokeMethod, null, obj, new object[] { "hell world!" }); 

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

dynamic obj = Activator.CreateInstance(t, null);
obj.Talk("hell world!");

  因此,dynamic只要使用得法,还是一个C#一个非常好的特征。

最后给大家总结以下:

常有人会拿var这个关键字来和dynamic做比较。实际上,var和dynamic完全是两个概念,根本不应该放在一起做 比较。var实际上是编译期抛给我们的“语法糖”,一旦被编译,编译期会自动匹配var 变量的实际类型,并用实际类型来替换该变量的申明,这看上去就好像我们在编码的时候是用实际类型进行申明的。而dynamic被编译后,实际是一个 object类型,只不过编译器会对dynamic类型进行特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期。

这从visual studio的编辑器窗口就能看出来。以var声明的变量,支持“智能感知”,因为visual studion能推断出var类型的实际类型,而以dynamic声明的变量却不支持“智能感知”,因为编译器对其运行期的类型一无所知。对 dynamic变量使用“智能感知”,会提示“此操作将在运行时解析”。

(0)

相关推荐

  • c++ dynamic_cast与static_cast使用方法示例

    首先dynamic_cast: 复制代码 代码如下: #include <iostream>using namespace std;class A{    public:        virtual ~A(){} //使用dynamic_cast时,必要!};class B:public A{    public:        B(){            m_b=12;        }        void foo(){            cout<<"B

  • C++ 中dynamic_cast&lt;&gt;的使用方法小结

    即会作一定的判断.        对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针:        对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用. 注意:dynamic_cast在将父类cast到子类时,父类必须要有虚函数.例如在下面的代码中将CBasic类中的test函数不定义成        virtual时,编译器会报错:error C2683: dynamic_cast : "CBasic"不是多态

  • iOS开发中使用UIDynamic来捕捉动画组件的重力行为

    UIDynamic基本认识 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如:重力.弹性碰撞等现象 2.物理引擎的价值 广泛用于游戏开发,经典成功案例是"愤怒的小鸟" 让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果 提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏 3.知名的2D物理引擎 Box2d Chipmunk 二.使用步骤 要想使

  • C# dynamic关键字的使用方法

    C#是一种类型安全的编程语言(所有表达式都能解析成某个类型的实例,在编译器生成的代码中,只会执行对这个类型有效的操作),和非类型安全的语言相比,类型安全的优势就体现出来了:1.许多错误能在编译时检测到,取保代码在执行它之前是正确的.2.编译时语言通常能生成更小,更快的代码.(在编译时进行更多的假设,并在IL和元数据中落实那些假设) 为了方便开发人员使用反射或者与基本组件通信,dynamic诞生了!一下代码展示了如何利用反射在一个String目标("根据我找类型")上调用一个方法(&qu

  • Dynamic和Var的区别及dynamic使用详解

    C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,他们都可以申明动态类型的变量,但是本质上他们还是有不少区别的.var 在编译阶段已经确定类型,在初始化时候,必须提供初始化的值,而dynamic则可以不提供,它是在运行时才确定类型. 1.var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型. 2.var只能用于声明方法内部的局部变量,而dynamic可用于局部变量,字段,参数. 3.表达式不能转型为var,但能转型为dynamic. 4.必须

  • Java 中的vector和list的区别和使用实例详解

    要了解vector,list,deque.我们先来了解一下STL. STL是Standard Template Library的简称,中文名是标准模板库.从根本上说,STL是一些容器和算法的集合.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adapters).算法(algorithms).仿函数(functors)六个部分.指针被封装成迭代器,这里vector,list就是所谓的容器. 我们常常在实现链表,栈,队列或者数组时,

  • Java中==运算符与equals方法的区别及intern方法详解

    Java中==运算符与equals方法的区别及intern方法详解 1.  ==运算符与equals()方法 2. hashCode()方法的应用 3. intern()方法 /* Come from xixifeng.com Author: 习习风(StellAah) */ public class AboutString2 { public static void main(String[]arsgs) { String myName="xixifeng.com"; String

  • SpringMVC视图转发重定向区别及控制器示例详解

    目录 SpringMVC视图 一.ThymeleafView 二.转发视图 三.重定向视图 四.转发和重定向区别 五.视图控制器 view-controller SpringMVC视图 SpringMVC 中的视图是 View 接口,视图的作用是渲染数据,将模型 Model 中的数据展示给用户. 视图的种类很多,默认有:转发视图和重定向视图. 若使用的视图技术为 Thymeleaf,在 SpringMVC 的配置文件中配置了 Thymeleaf 的视图解析器,由此视图解析器解析之后所得到的是 T

  • jquery遍历之parent()和parents()的区别及parentsUntil()方法详解

    .parent(selector) 获得当前匹配元素集合中每个元素的父元素,由选择器筛选(可选). .parents(selector) 获得当前匹配元素集合中每个元素的祖先元素,由选择器筛选(可选). 如果给定一个表示 DOM 元素集合的 jQuery 对象,.parents() 方法允许我们在 DOM 树中搜索这些元素的祖先元素,并用从最近的父元素向上的顺序排列的匹配元素构造一个新的 jQuery 对象.元素是按照从最近的父元素向外的顺序被返回的..parents() 和 .parent()

  • Java中long类型与Long类型的区别和大小比较详解

    前言 最近在学习java,接触到了long类型,发现网上这方面的资料较乱,所以决定总结一下,在Java中我们经常要做一些判断,而对于判断的话,用的最多的便是">"."=="."<"的比较,这里我们进行一个Long类型数据和long类型数据的比较大小的讲解.话不多说了,来一起看看详细的介绍吧. Java中Long和long的区别 Java的数据类型分为两种: 1.基本类型:byte(8),short(16),int(32),long(6

  • Kotlin作用域函数之间的区别和使用场景详解

    作用域函数 Kotlin 的作用域函数有五种:let.run.with.apply 以及 also. 这些函数基本上做了同样的事情:在一个对象上执行一个代码块. 下面是作用域函数的典型用法: val adam = Person("Adam").apply { age = 20 city = "London" } println(adam) 如果不使用 apply 来实现,每次给新创建的对象属性赋值时就必须重复其名称. val adam = Person("

  • PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)

    register_globals的值可以设置为:On或者Off,我们举一段代码来分别描述它们的不同. 代码: 复制代码 代码如下: <form name="frmTest" id="frmTest" action="URL"> <input type="text" name="user_name" id="user_name"> <input type=&q

  • Oracle区别ADG与DG案例详解

         在上云后的Oracle数据灾备场景中,我们经常听到DBA迁移工程师讲到"在这个项目中用ADG进行数据实时备份,ADG比DG更好!".究竟ADG作Oracle数据灾备的优势在什么地方? 一.ADG主要解决了DG时代读写不能并行的问题         DG时代的数据同步方式如采用Redo Log的物理方式,则数据库同步数据快.耗用资源低,但存在一个大问题.         Oracle 11G以前的Data Guard物理备份数据库,可以以只读的方式打开数据,但这时日志的数据同步

  • 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic

    随着C#的发展,该语言内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑.C# 语言从诞生起就是强类型语言,这一性质到今天不曾改变,我想以后也不会变.既然是强类型语言,那编写任一程序均要求满足下面的基本条件: 1.变量声明必须指明其类型 2.变量类型明确后,其类型在Runtime亦不能改变 代码如下: public class Student { public string Name { get; set; } public int Age { get; set; } public str

随机推荐