在通过 dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查, 改为在运行时解析这些操作。 dynamic 类型简化了对 COM API(例如 Office Automation API)、动态 API(例如 IronPython 库)和 HTML 文档对象模型 (DOM) 的访问。

在大多数情况下,dynamic 类型与 object 类型的行为是一样的。 但是,不会用编译器对包含 dynamic 类型表达式的操作进行解析或类型检查。 编译器将有关该操作信息打包在一起,并且该信息以后用于计算运行时操作。 在此过程中,类型 dynamic 的变量会编译到类型 object 的变量中。 因此,类型 dynamic 只在编译时存在,在运行时则不存在。

以下示例将类型为 dynamic 的变量与类型为 object 的变量对比。 若要在编译时验证每个变量的类型,请将鼠标指针放在 WriteLine 语句中的 dyn 或 obj 上。 IntelliSense 显示了 dyn 的“动态”和 obj 的“对象”。

class Program

{

static void Main(string[] args)

{

dynamic dyn = 1;

object obj = 1;

// Rest the mouse pointer over dyn and obj to see their

// types at compile time.

System.Console.WriteLine(dyn.GetType());

System.Console.WriteLine(obj.GetType());

}

}

WriteLine 语句显示 dyn 和 obj 的运行时类型。 此时,两者具有相同的整数类型。 将生成以下输出:

System.Int32

System.Int32

若要查看 dyn 和 obj 之间的差异,请在前面示例的声明和 WriteLine 语句之间添加下列两行之间。

dyn = dyn + 3;

obj = obj + 3;

为尝试添加表达式 obj + 3 中的整数和对象报告编译器错误。 但是,不会报告 dyn + 3 错误。 编译时不会检查包含 dyn 的表达式,原因是 dyn 的类型为 dynamic。

dynamic 关键字可以直接出现或作为构造类型的组件在下列情况中出现:

  • · 在声明中,作为属性、字段、索引器、参数、返回值或类型约束的类型。 下面的类定义在几个不同的声明中使用 dynamic。

class ExampleClass

{

// A dynamic field.

static dynamic field;

// A dynamic property.

dynamic prop { get; set; }

// A dynamic return type and a dynamic paramater type.

public dynamic exampleMethod(dynamic d)

{

// A dynamic local variable.

dynamic local = "Local variable";

int two = 2;

if (d is int)

{

return local;

}

else

{

return two;

}

}

}

  • · 在显式类型转换中,作为转换的目标类型。

static void convertToDynamic()

{

dynamic d;

int i = 20;

d = (dynamic)i;

Console.WriteLine(d);

string s = "Example string.";

d = (dynamic)s;

Console.WriteLine(d);

DateTime dt = DateTime.Today;

d = (dynamic)dt;

Console.WriteLine(d);

}

// Results:

// 20

// Example string.

// 2/17/2009 9:12:00 AM

  • · 在以类型充当值(如 is 运算符或 as 运算符右侧)或者作为 typeof 的参数成为构造类型的一部分的任何上下文中。 例如,可以在下列表达式中使用 dynamic。

int i = 8;

dynamic d;

// With the is operator.

// The dynamic type behaves like object. The following

// expression returns true unless someVar has the value null.

if (someVar is dynamic) { }

// With the as operator.

d = i as dynamic;

// With typeof, as part of a constructed type.

Console.WriteLine(typeof(List<dynamic>));

// The following statement causes a compiler error.

//Console.WriteLine(typeof(dynamic));

下面的示例以多个声明使用 dynamic。 Main 也用运行时类型检查对比编译时类型检查。

using System;

namespace DynamicExamples

{

class Program

{

static void Main(string[] args)

{

ExampleClass ec = new ExampleClass();

Console.WriteLine(ec.exampleMethod(10));

Console.WriteLine(ec.exampleMethod("value"));

// The following line causes a compiler error because exampleMethod

// takes only one argument.

//Console.WriteLine(ec.exampleMethod(10, 4));

dynamic dynamic_ec = new ExampleClass();

Console.WriteLine(dynamic_ec.exampleMethod(10));

// Because dynamic_ec is dynamic, the following call to exampleMethod

// with two arguments does not produce an error at compile time.

// However, itdoes cause a run-time error.

//Console.WriteLine(dynamic_ec.exampleMethod(10, 4));

}

}

class ExampleClass

{

static dynamic field;

dynamic prop { get; set; }

public dynamic exampleMethod(dynamic d)

{

dynamic local = "Local variable";

int two = 2;

if (d is int)

{

return local;

}

else

{

return two;

}

}

}

}

// Results:

// Local variable

// 2

// Local variable

C# dynamic使用相关推荐

  1. ideal如何创建dynamic web project

    步骤如下 ① file -> new -> project ② 选择 Java Enterprise -> next ③ create project from template - ...

  2. Uva 3767 Dynamic len(set(a[L:R])) 树套树

    Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/in ...

  3. 需要反射时使用dynamic

    //使用dynamic的写法 dynamic fileExplorerData = _currentFolder.FileExplorerData; var data = fileExplorerDa ...

  4. Towards Real-time Semantic RGB-D SLAM in Dynamic Environments(动态语义SLAM)

    动态环境下的实时语义SLAM 简介 摘要 系统流程 实验结果 总结 简介 在ICRA 2021上看到这样一篇论文:Towards Real-time Semantic RGB-D SLAM in Dy ...

  5. ADPRL - 近似动态规划和强化学习 - Note 7 - Approximate Dynamic Programming

    Note 7 - 近似动态规划 Approximate Dynamic Programming 7. 近似动态规划 (Approximate Dynamic Programming) 7.1 近似架构 ...

  6. ADPRL - 近似动态规划和强化学习 - Note 5 - Banach Fixed Point Theorem in Dynamic Programming

    动态规划中的巴拿赫不动点定理 5. Banach Fixed Point Theorem in Dynamic Programming 5.1 巴拿赫不动点定理定理 (Banach fixed poi ...

  7. 强化学习(二)- 动态规划(Dynamic Programming)

    3.动态规划 3.1 介绍 术语动态规划(DP:Dynamic Programming) 指的是一个算法集合,可以用来计算最优策略,给定一个完美的环境模型,作为马尔可夫决策过程(MDP).经典的DP算 ...

  8. Simple Dynamic Strings(SDS)源码解析和使用说明二

    在<Simple Dynamic Strings(SDS)源码解析和使用说明一>文中,我们分析了SDS库中数据的基本结构和创建.释放等方法.本文将介绍其一些其他方法及实现.(转载请指明出于 ...

  9. 了解 C# “.NET研究”4 中的 Dynamic 关键字

    dynamic 关键字和动态语言运行时 (DLR) 是 C# 4 和 Microsoft .NET Framework 4 中的重大新增功能. 这些功能在宣布时就引起了人们的极大兴趣,并伴随着许多疑问 ...

  10. 【引用】在Eclipse中将java Project转换成Dynamic Web Project

    编辑工程的.project文件: 添加 <nature>org.eclipse.wst.common.project.facet.core.nature</nature> &l ...

最新文章

  1. 在SQL Server中如何转化长日期形式为短日期格式
  2. 网页挂马防护市场探索
  3. DeepMind发布最新原始音频波形深度生成模型WaveNet,将为TTS带来无数可能
  4. 在企业内部使用openssl创建私有CA
  5. 嵌套函数,匿名函数,高阶函数
  6. spring mvc学习(9):路径参数
  7. GO学习笔记 - Go 只有一种循环结构—— for 循环。
  8. linux从usb安装软件,Linux下USB Camera的安装和使用
  9. ajax 验证成功 转跳,利用ajax实现登录:验证完用户信息后如何保存用户信息并实现跳转...
  10. linux/unix编程手册-6_10
  11. [LeetCode] Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树...
  12. 基于java的KTV点歌选歌系统
  13. windows“运行”自定义“命令”的实现
  14. sqlite数据库的版本更替
  15. 虚拟机上装oracle,cmd窗口输入法有问题,按了U,I,O,P,J,K,L,M这些键为什么不是UIOPJK
  16. WC2015简短感想
  17. 【区块链】Web3.0黑话合集:区块链/Token等专业术语
  18. 1750套工装夹具检具治具机械设计机构solidworks模型3d课程图纸sw
  19. maven项目的pom.xml文件添加依赖
  20. matlab x和y不对应,用matlAB求x和y的对应每行的相关系数!比如x中第一行和y中第一行的相关系数!依次的到没行的一个相关系数...

热门文章

  1. python应用:最长无重复字串提取
  2. html引入iview如何修改样式,vue中如何修改iView的样式,
  3. this指针_c++11新特性之智能指针
  4. python3 open()内置函数
  5. python pandas读取csv_Python3 pandas怎么读取csv文件的第一行的
  6. JAVA 判断其是否为合法标识符
  7. matconvnet中使用fastrcnn遇到的问题
  8. 【深度学习】自然场景中文汉字数据集下载
  9. Caffe学习系列(9):运行caffe自带的两个简单例子
  10. 日期格式YYYY-mm-dd HH:MM:SS大小写解释