zoukankan      html  css  js  c++  java
  • 动态对象(dynamic)的用法

    说到正确用法,那么首先应该指出一个错误用法:

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

    我认为dynamic很有价值的一点是:

    类型转换
    Dynamic类型的实例和其他类型的实例间的转换是很简单的,开发人员能够很方便地在dyanmic和非dynamic行为间切换。任何实例都能隐式转换为dynamic类型实例,见下面的例子:
    dynamic d1 = 7;
    dynamic d2 = "a string";
    dynamic d3 = System.DateTime.Today;
    dynamic d4 = System.Diagnostics.Process.GetProcesses();
     
    Conversely, an implicit conversion can be dynamically applied to any expression of type dynamic.
    反之亦然,类型为dynamic的任何表达式也能够隐式转换为其他类型。
    int i = d1;
    string str = d2;
    DateTime dt = d3;
    System.Diagnostics.Process[] procs = d4;
     

    dynamic可以简化反射

    首先还是声明一下,使用场景:

    1、如果编译时函数名称确定,对象类型运行时确定,那么运用dynamic是一个好主意。
    2、如果编译时函数名称确定,对象类型在编译时也确定,那就既不需要反射也不需要dynamic。
    3、如果函数名称在运行时才能确定的话,那函数名称就是一个字符串,必须使用反射来完成。

    以前我们这样使用反射:

    public class DynamicSample
    {
    public string Name { get; set; }
    
    public int Add(int a, int b)
    {
    return a + b;
    }
    }
    DynamicSample dynamicSample = new DynamicSample(); //create instance为了简化演示,我没有使用反射
    var addMethod = typeof(DynamicSample).GetMethod("Add");
    int re = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });

    现在,我们有了简化的写法:

    dynamic dynamicSample2 = new DynamicSample();
    int re2 = dynamicSample2.Add(1, 2);
  • 相关阅读:
    python 包管理工具 pip 的配置
    Python 变量作用域 LEGB (下)—— Enclosing function locals
    Python 变量作用域 LEGB (上)—— Local,Global,Builtin
    2020 Java 面试题 小结 (答案慢慢补上,有错误请指出)
    mysql 根据日期(date)做年,月,日分组统计查询
    jvm指令
    正则表达式 分割地址 获取省市区详细地址
    .Net 异常记录
    WCF设计服务协议(一)
    plsql ORA-01789:查询块具有不正确的结果列数
  • 原文地址:https://www.cnblogs.com/sylone/p/6225911.html
Copyright © 2011-2022 走看看