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

一. 为什么是它们三个?

拿这三者比较的原因是它们在使用的时候非常相似。你可以用它们声明的变量赋任何类型的值。

看看下面的示例:

var a = 1;object b = 1;
dynamic c = 1;

 你还可以使用关键字为它们赋上更加复杂的类型

var a = new string[]{"1"};object b = new string[]{"1"};
dynamic c = new string[]{"1"};

二. 能够任意赋值的原因

 上面的例子中,看起来三者非常相似,但是背后的原理却是非常不同。

var是C# 3中引入的,其实它仅仅只是一个语法糖. var本身并不是一种类型, 其它两者object和dynamic是类型。

var声明的变量在赋值的那一刻,就已经决定了它是什么类型。

所以如果你这样使用,就会有编译错误:

var a = 1;
a = "Test";

 

object之所以能够被赋值为任意类型的原因,其实都知道,因为所有的类型都派生自object. 所以它可以赋值为任何类型:

object a = 1;
a = "Test";

 那么dynamic呢?

它是C#引入的新类型,它的特点是申明为dynamic类型的变量,不是在编译时候确定实际类型的, 而是在运行时。

所以下面的代码是能够通过编译的,但是会在运行时报错:

dynamic a = "test";
a++;

上面代码内部处理的过程是怎样的呢?

首先, dynamic类型赋值为字符串"test", 运行++操作的时候,.net会去寻找当前的赋值类型string中是否支持++操作,发现不支持,出现异常。

所以,如果这样修改一下,就可以让代码正常运行起来

dynamic a = "test";
a = 1;
a++;

三. dynamic的用法

1 直接使用该类型,可以非常方便的插入属性, 方法

static void Main(string[] args)
{dynamic person = new System.Dynamic.ExpandoObject();person.Name = "cary";person.Age = 25;person.ShowDescription = new Func<string>(() => person.Name + person.Age);Console.WriteLine(person.Name + person.Age + person.ShowDescription());Console.ReadLine();
}

枚举所有成员

foreach (var property in (IDictionary<String, Object>)dynEO)
{Console.WriteLine(property.Key + ": " + property.Value);
}

3 简化反射

常用的处理反射的例子:

object calc = GetCalculator();
Type calcType = calc.GetType();object res = calcType.InvokeMember( "Add", BindingFlags.InvokeMethod, null, new object[] { 10, 20 });int sum = Convert.ToInt32(res);

使用dynamic之后:

 dynamic calc = GetCalculator(); int sum = calc.Add(10, 20);

 

四,使用dynamic的注意事项

有了dynamic,.net就以及有了动态类型的优势,但是由于对于dynamic类型的所有操作,都是在运行时确定的,所有错误无法在编译时候出现,使用的时候,就需要非常小心。

因为dynamic是类型,所以如果函数接受的是确定类型的参数,是不能传入dynamic类型的,这样会有编译错误

public int Add(int a, int b){  
  
return a + b; } dynamic test1 = 1; dynamic test2 = 2; Add(test1, test2);


下面是对上面的例子的修正,谢谢Alan@Net. 大家可以实验一下

  1. #15楼 Alan@Net  2014-02-04 21:30

    为什么我copy你最后一个例子,并没有报错?

    支持(0)反对(0)

    回复引用删除

  2. #16楼[楼主JustRun  2014-02-07 08:30

    @Alan@Net
    应该是编译不通过,我待会试试

    支持(0)反对(0)

    修改删除

  3. #17楼[楼主JustRun  2014-02-08 08:29

    @Alan@Net
    是不会报错,对于普通的类型,int这样的,不会有问题。
    但是如果是对象类型,运行时会报错。

 

另外,在我们自己在写函数时,最好不要将dynamic类型作为函数的参数,这就像是使用object作为函数参数一样,会为程序的维护带来后续的麻烦。

没有人能够确定使用者传入的是什么,而且编译时候不会有问题。如果错误出现在运行时,就有可能是灾难。

原文地址:http://www.cnblogs.com/JustRun1983/p/3163350.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

获取笔记本的SHA1的值。

开发Android几年来&#xff0c;经常出现这样的情况&#xff0c;每次使用到地图的时候&#xff0c;不知道如何获得笔记本的SHA1值&#xff0c;尤其是在跟换笔记本开发的时候。 因此在CSDN上做一下笔记&#xff01; 进入cmd模式 cd C:\Users\Administrator.android> 输入keyto…

建模:确定服务的边界——《微服务设计》读书笔记

什么样的服务才是好的服务? 高内聚、松耦合的服务才是好的服务。简而言之&#xff0c;就是把相关性强的放在一起&#xff0c;相关性不强的分开&#xff0c;物以类聚&#xff0c;人以群分&#xff0c;服务的划分也是这样。这就需要确定什么要放在一起&#xff0c;什么是要分开的…

谈谈系统稳定性设计

转载自 谈谈系统稳定性设计 一、差旅随想 因为base在分公司&#xff0c;需要经常去总部出差&#xff0c;所以搭乘飞机成了家常便饭&#xff0c;很多时候坐在飞机上会不由的感叹&#xff0c;设计制造这样精密复杂的机器的那帮人真的是了不起&#xff0c;他们是怎样保证这样一台…

Android使用MPAndroidChat

参考文档&#xff1a; https://blog.csdn.net/u013184970/article/details/52095170 https://blog.csdn.net/cen_yuan/article/details/52204281 注意&#xff1a; 在要使用的module的build.gradle添加: dependencies { compile ‘com.github.PhilJay:MPAndroidChart:v3.0.0-be…

微服务集成——《微服务设计》读书笔记

一.理想的集成应该是什么样的&#xff1f; 1.避免破坏性修改 如果在一个微服务的响应中添加一个字段&#xff0c;服务的消费方不应该受到影响。 2.保证API的技术无关性 微服务之间的通信应该是与技术无关的。 3.使服务的消费方易于使用 如果消费方使用该服务比登天还难&…

什么是加密算法

转载自 什么是加密算法 Java的加密知识也是Java常见的领域之一&#xff0c;加密技术的底层确实很复杂&#xff0c;运用了大量的数学知识&#xff0c;要弄明白非常复杂。但是Java语言中运用密码加密工具却是非常简单。我们在Java里面运用这些加密技术&#xff0c;只需要把原理…

Android传感器的使用

Android 中主要的传感器有以下几种 TYPE_ACCELEROMETER 加速度传感器又叫 G-sensor&#xff0c;该数值包含地心引力的影响&#xff0c;单位是 m/s 测量应用于设备 x 、y、z 轴上的加速度。 将手机平放在桌面上&#xff0c;x 轴默认为0&#xff0c;y 轴默认0&#xff0c;z 轴默…

理解C# 4 dynamic(2) – ExpandoObject的使用

ExpandoObject的使用非常简单&#xff0c;很容易入手。上一篇里面已经有详细的介绍了&#xff0c;可以看这里(理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用) 下面对ExpandoObject的使用场合和一些认为需要注意的地方&#xff0c;谈一下自己的看法: 一…

谈谈服务限流算法的几种实现

转载自 谈谈服务限流算法的几种实现 保障服务稳定的三大利器&#xff1a;熔断降级、服务限流和故障模拟。今天和大家谈谈限流算法的几种实现方式&#xff0c;本文所说的限流并非是Nginx层面的限流&#xff0c;而是业务代码中的逻辑限流。 为什么需要限流 按照服务的调用方&…

Android如何实现NoActionBar以及Theme.NoTitleBar.Fullscreen效果

效果一 NoActionBar 无论Activity继承自Activity还是AppCompatActivity 只需要在styles中的修改Theme <style name"AppTheme" parent"Theme.AppCompat.Light.NoActionBar"><!-- Customize your theme here. --><item name"colorPrima…

自己动手写一个能操作redis的客户端

转载自 自己动手写一个能操作redis的客户端 引言 redis大家在项目中经常会使用到。官网也提供了多语言的客户端供大家操作redis,如下图所示 但是&#xff0c;大家有思考过&#xff0c;这些语言操作redis背后的原理么&#xff1f;其实&#xff0c;某些大神会说 只要按照redis…

离线安装 VS2017 的正确姿势

国内的网络环境&#xff0c;真的是有很大的不同&#xff0c;有的人装 VS 的时候&#xff0c;号称满速&#xff0c;有的人&#xff08;其实就是我&#xff09;要等它下载很久&#xff0c;还告诉我有个组件没有安装成功。很久很久以前&#xff0c;VS 是提供 ISO 版的离线安装包的…

Android中ImageView的旋转与缩放

说明在代码中已经注释 XML代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"wra…

ASP.NET Core MVC四种枚举绑定方式

前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便&#xff0c;之前我们探讨过在ASP.NET MVC中下拉框绑定方式&#xff0c;这节我们来再来重点看看枚举绑定的方式&#xff0c;充分实现你所能想到的场景&#xff0c;满满的干货&#xff0c;你值得拥有。 探讨枚举绑…

关于分布式事务、两阶段提交协议、三阶提交协议

转载自 关于分布式事务、两阶段提交协议、三阶提交协议 随着大型网站的各种高并发访问、海量数据处理等场景越来越多&#xff0c;如何实现网站的高可用、易伸缩、可扩展、安全等目标就显得越来越重要。 为了解决这样一系列问题&#xff0c;大型网站的架构也在不断发展。提高…

React对标签属性进行限制(props)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>对props进行限制</title> </head> <body><!-- 准备好一个“容器” --><div id"test1"></div><div …

服务的协作:服务间的消息传递——《微服务设计》读书笔记

在微服务集成——《微服务设计》读书笔记文章中&#xff0c;我们说过服务间的消息传递有几种方式&#xff0c;一种是请求/响应技术&#xff0c;另一种是基于事件的机制。 RPC&#xff08;远程过程调用&#xff09; RPC是Remote Procedure Call的简称。 这是请求/响应技术的一种…

jdbc事务和事务的隔离级别

转载自 jdbc事务和事务的隔离级别 在jdbc的使用中以最简单的jdbc的使用为例&#xff0c;说明了jdbc的具体用法。然而在通常项目中&#xff0c;需要考虑更多内容&#xff0c;例如事务。 事务&#xff0c;在单个数据处理单元中&#xff0c;存在若干个数据处理&#xff0c;要么整…

Android自定义View画钟表

第一种使用背景表盘 主要代码&#xff1a; package com.zjs.zidingyiview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Handler; import android.os.Message; impo…