# 4.0的主题就是动态编程(Dynamic Programming)。虽然C#仍然是一种静态语言,但是对象的意义开始变得越来越“动态”。它们的结构和行为无法通过静态类型来捕获,或者至少编译器在编译程序时无法得知对象的结构和行为。

  C#引入了一种新的静态类型”dynamic”,当你拥有了一个dynamic类型的对象后,你“对它做的事情”只会在运行时进行解析。设想我们拥有这样两个类,分别表示两种饮料:

  public class Coffee

{public string GetName()

{

return "You selected Maxwell coffee.";

}

}

  public class Juice

{

public string GetName()

{

return "You selected orange juice.";

}

}

  现在,我们就可以用dynamic类型来表示这两种饮料。我们写一个函数GetDrink(),根据用户不同的选择返回不同的对象。

  static private Object GetDrink(int i)

{

if (i == 1)

{

return new Juice();

}

else

// default

{

return new Coffee();

}

}

  static void Main(string[] args)

{Console.WriteLine("Please Select Your Drink: 1 -- Juice; 2 -- Coffee");

int nDrinkType = Console.Read();

dynamic drink = GetDrink( nDrinkType );

Console.WriteLine( drink.GetName() );

}

  C#编译器允许你通过dynamic对象调用任何方法,即使这个方法根本不存在,编译器也不会在编译的时候报编译错误。只有在运行的时候,它才会检查这个对象的实际类型,并检查在它上面GetName()是什么意思。动态类型将使得C#可以以更加统一而便利的形式表示下列对象:

  ◆ 来自动态编程语言——如Python或Ruby——的对象

  ◆ 通过IDispatch访问的COM对象

  ◆ 通过反射访问的一般.NET类型

  ◆ 结构发生过变化的对象——如HTML DOM对象

  当我们得到一个动态类型的对象时,不管它是来自COM还是IronPython、HTML DOM还是反射,只需要对其进行操作即可,动态语言运行时(DLR)会帮我们指出针对特定的对象以及这些操作的具体意义。这将给我们的开发带来极大的灵活性,并且能够极大程度上地精简我们的代码。

 
0

C# 4.0中的动态类型和动态编程的更多相关文章

  1. 在 Typescript 2.0 中使用 @types 类型定义

    在 Typescript 2.0 中使用 @type 类型定义 基于 Typescript 开发的时候,很麻烦的一个问题就是类型定义.导致在编译的时候,经常会看到一连串的找不到类型的提示.解决的方式经 ...

  2. IHostingEnvironment VS IHostEnvironment - .NET Core 3.0中的废弃类型

    原文: https://andrewlock.net/ihostingenvironment-vs-ihost-environment-obsolete-types-in-net-core-3/ 作者 ...

  3. OC 动态类型,动态绑定,动态加载

    OC 动态类型,动态绑定,动态加载 Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有 动态类型(Dynamic typing) 动态绑定(Dynamic binding) ...

  4. C# 动态类型与动态编译简介

    关于C#的动态类型与动态编译的简介,主要是一个Demo. 动态类型 关键字: dynamic 这里有详细的介绍:[C#基础知识系列]专题十七:深入理解动态类型 动态类型的应用场景 可以减少强制转换(强 ...

  5. 《精通C#》第十六章-动态类型和动态语言运行时-第一节至第四节

    在.Net4.0中引入了一个关键字dynamic,这是一个动态类型关键字.Net中还有一个关键字是var,这是一个隐式类型,可以定义本地变量,此时var所代表的实际的数据类型有编译器在初次分配时决定, ...

  6. 动态类型识别&动态创建

    以下大部分内容摘自<windows程序设计 第2版> 王艳平 张铮 编著 动态类型识别:在程序运行过程中,辨别对象是否属于特定类的技术. 应用举例:函数辨别参数类型.需要针对对象的类编写特 ...

  7. var和dynamic的应用 var、动态类型 dynamic 深入浅析C#中的var和dynamic ----demo

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic

    比如有一个匿名对象,var  result =......Select( a=>new {  id=a.id, name=a.name});然后Object  obj =  result ;我怎 ...

  9. C# 中的动态类型

    翻译自 Camilo Reyes 2018年10月15日的文章 <Working with the Dynamic Type in C#> [1] .NET 4 中引入了动态类型.动态对象 ...

随机推荐

  1. Spring整合Quartz定时发送邮件

    功能描述:刚开始接触Quartz,试着用Quartz整合spring实现每隔一分钟发送一封邮件连续发送10次 核心jar: 邮件发送:commons-email-1.2.jar mail.jar(必须 ...

  2. mssql查询所有上下级

    if exists (select * from sys.all_objects where name='GetOrgTreeByID') begin drop proc GetOrgTreeByID ...

  3. source insight 4.0的基本使用方法(转)

    源:source insight 4.0的基本使用方法 source insight 4设置

  4. Java之网络爬虫WebCollector2.1.2+selenium2.44+phantomjs2.1.1

    Java之网络爬虫WebCollector2.1.2+selenium2.44+phantomjs2.1.1 一.简介 版本匹配: WebCollector2.12 + selenium2.44.0 ...

  5. STM32组合设备实现USB转双串口

    USB转双串口,核心技术就在于组合设备(USB Composite)的实现,组合设备的实现,其核心技术在于描述符的实现,下面我们先给出描述符:设备描述符 [C] 纯文本查看 复制代码 ? 00001 ...

  6. 使用ntpdate工具校正linux服务器时间

    当Linux服务器的时间不对的时候,可以使用ntpdate工具来校正时间. 安装:yum install ntpdate ntpdate简单用法: # ntpdate ip # ntpdate 210 ...

  7. linux突然断电重启,配置文件丢失/程序无法打开/文件损坏

    电脑突然断电,重新开机后发现有的程序无法正常启动,原因是配置文件损坏了.感觉奇怪,为什么在硬盘里的文件会内容丢失? 1.可能:写数据的过程被中断,只完成了一部分.可能会出现乱码(因为只写了几个字节,不 ...

  8. json.dump()和json.load()

    import json,time # save data to json file def store(data): with open('data.json', 'w') as fw: # 将字典转 ...

  9. dva subscription的使用方法

    import { routerRedux } from 'dva/router' export default { namespace: 'notice', state: { notices:[], ...

  10. UVA-10410 Tree Reconstruction (树重建)

    题目大意:给出对一棵树的BFS遍历序列和DFS遍历序列,求出每一个节点的子节点. 题目分析:在BFS的序列中,子节点的下标一定比父节点的下标至少大1(根节点与第一个子节点除外),即pos[fa]+1& ...