Unity中面试遇到的问题--C#--dynamic

embedded/2024/10/22 1:06:45/

C#中的Dynamic相关的知识点

在C#中,dynamic 关键字允许我们延迟对对象类型的解析。这意味着我们可以声明一个变量为 dynamic 类型,而不需要知道它的确切类型。在编译时,编译器不会检查 dynamic 变量的类型,而是将类型检查推迟到运行时。这使得 dynamic 变量可以用于处理不同类型的对象,只要这些对象在运行时支持相应的操作。

说人话就是: 写代码的时候时候编辑器不报错、不报警告. 运行的时候, 如果有错会报错.由于类型检查放到了运行时候,因此理论上来说速度会慢点.

1.微软官方对dynamic的讲解和示例:

Using type dynamic - C# | Microsoft Learn
点击超链接或者点击下面的连接可以访问微软官方讲解dynamic的内容
https://learn.microsoft.com/en-us/dotnet/csharp/advanced-topics/interop/using-type-dynamic

static void Main(string[] args)
{ExampleClass ec = new ExampleClass();// The following call to exampleMethod1 causes a compiler error// if exampleMethod1 has only one parameter. Uncomment the line// to see the error.//ec.exampleMethod1(10, 4);dynamic dynamic_ec = new ExampleClass();// The following line is not identified as an error by the// compiler, but it causes a run-time exception.dynamic_ec.exampleMethod1(10, 4);// The following calls also do not cause compiler errors, whether// appropriate methods exist or not.dynamic_ec.someMethod("some argument", 7, null);dynamic_ec.nonexistentMethod();
}
class ExampleClass
{public ExampleClass() { }public ExampleClass(int v) { }public void exampleMethod1(int i) { }public void exampleMethod2(string str) { }
}

2.dynamic的简介

dynamic 关键字的作用和简介如下:

  1. 延迟类型检查:使用 dynamic 关键字,我们可以延迟类型检查直到运行时。这允许我们在编译时避免类型不匹配的错误,因为这些错误会在运行时被捕获。

  2. 动态类型赋值:我们可以将任何类型的对象赋值给 dynamic 类型的变量。例如,我们可以这样做:

    dynamic myDynamicVar = "Hello, World!"; // 可以看出dynamic是一种类型
    myDynamicVar = 42;
    myDynamicVar = true;
    
  3. 动态方法调用dynamic 变量可以调用任何方法,即使这些方法在编译时不存在于对象的类型中。在运行时,如果对象支持这些方法,它们将被调用;否则,将抛出异常。

  4. 动态属性访问:与动态方法调用类似,dynamic 变量可以访问任何属性,即使这些属性在编译时不存在于对象的类型中。

  5. 动态事件处理dynamic 变量可以订阅和引发事件,即使这些事件在编译时不存在于对象的类型中。

  6. 动态运算符重载dynamic 变量可以参与任何运算符重载操作,即使这些运算符在编译时不存在于对象的类型中。

  7. object 的区别:虽然 dynamicobject 都可以表示任何类型的对象,但它们在处理方式上有所不同。object 类型在编译时进行类型检查,而 dynamic 类型在运行时进行类型检查。

  8. 使用场景dynamic 关键字通常用于处理动态类型语言(如 JavaScript)与C#之间的交互,以及处理 COM 对象和动态生成对象的情况。

  9. 性能考虑:由于 dynamic 关键字在运行时进行类型检查,因此它可能会影响性能。在性能敏感的应用中,应谨慎使用 dynamic

  10. 异常处理:当尝试对 dynamic 变量执行不支持的操作时,将抛出 RuntimeBinderException 异常。
    总之,dynamic 关键字提供了一种灵活的方式来处理不同类型的对象,但它也带来了一些性能和异常处理的挑战。在使用 dynamic 时,应权衡其优点和缺点,并根据具体场景做出决策。

3.Dynamic和Var的区别:

c#中我们使用var来进行自动类型推导, 在C++中使用的是auto来自动类型推导. 在C#中dynamic和var的区别是: var不是类型, dynamic是类型. 即

可以使用 dynamic 来声明变量, 使用var不可以声明变量

using System;
namespace Dynamic
{class DynamicAndVar{static void Main(string[] args){dynamic ab = 999; // 可以的var c = 0;		// 不可以的, 编译器报错Console.WriteLine(ab);  // 可以输出结果999Console.ReadKey();}}
}

4.使用dynamic

那么什么时候该使用,什么时候该避免滥用.

何时使用 dynamic

  1. 与动态语言交互:当需要与JavaScript、Python等动态类型语言交互时,dynamic 可以提供便利。例如,在ASP.NET MVC中使用JavaScript对象时,可以使用 dynamic 来避免复杂的类型转换。
  2. 处理COM对象:在与COM交互时,dynamic 类型允许您以更自然的方式处理COM接口和对象,因为COM对象通常是在运行时动态解析的。COM对象(Component Object Model object)是指遵循COM(组件对象模型)规范的对象。COM是微软开发的一种二进制接口标准,用于实现不同编程语言和平台之间的组件交互。COM对象可以在不同的应用程序、进程和机器之间进行通信和交互。
  3. 动态生成的类型:当处理由反射、代码生成或第三方库动态创建的对象时,dynamic 可以简化代码。
  4. 原型开发和快速迭代:在原型开发和快速迭代阶段,dynamic 可以帮助您更快地实现功能,而无需担心类型定义。

避免滥用 dynamic

  1. 性能考虑dynamic 类型在运行时进行类型检查,这可能会影响性能。在性能敏感的应用中,应避免使用 dynamic

  2. 类型安全性dynamic 类型牺牲了编译时的类型检查,这可能导致运行时错误。在需要严格类型安全性的场景中,应避免使用 dynamic

  3. 代码可维护性:使用 dynamic 可能使代码更难以理解和维护,因为编译器无法提供类型相关的错误检查。这可能导致在代码审查和调试时花费更多时间。

  4. 异常处理dynamic 类型在运行时抛出 RuntimeBinderException 异常,这使得异常处理变得复杂。在需要明确异常处理策略的场景中,应避免使用 dynamic

  5. 设计模式:在设计模式中,如依赖注入、工厂模式等,通常不推荐使用 dynamic,因为这些模式依赖于明确的类型定义和接口。

  6. 避免过度使用:即使在适当的情况下使用 dynamic,也应避免过度使用。应仅在其真正带来好处的情况下使用,而不是作为一种通用的编程习惯。


http://www.ppmy.cn/embedded/129418.html

相关文章

演示:基于WPF的DrawingVisual开发的高刷新率示波器

一、目的:分享一个基于WPF的DrawingVisual开发的高刷新率示波器 二、效果演示 特此说明:由于Gif录制工具帧率不够,渲染60帧用了4.6秒,平均帧率在12Hz左右,所以展示效果不好,想要看好些的效果可以看文章下面…

Android Studio Ladybug指定ndk版本

背景 想指定项目的ndk版本。 遇到错误 之前版本在gradle中配置ndk版本是这样的 ndkVersion "26.0.10792818"到了最新版as的时候提示错误,这个语法不存在了。 真的想骂人,这个as天天改语法,吃饱了没事做是吧。 android {namesp…

SQL注入总结

MYSQL常规注入 union select 1,2,3 -- a //查看页面回显字段union select group_concat(distinct(table_schema)),2,3 from information_schema.tables -- a //查数据库名一般在information_schema数据库下的tables表里找table_schema字段。其中distinct()是去重,…

3.1.1 ReactOS系统中二叉树创建一个MEMORY_AREA节点

二叉树中创建一个MEMORY_AREA节点: 二叉树中创建一个MEMORY_AREA节点: MmCreateMemoryArea() 参数AddressSpace是MADDRESS SPACE结构指针,所指向的数据结构代表着一个进程的用 户空间。 参数BaseAddress是个指针,用来给定和返回内…

设计模式总结

设计模式 设计模式就是软件源码中类和项目这两层。 本质上是类与类之间,文件与文件之间的关系。 是为了在增加和修改代码时,最大化复用代码,减少耦合度,减少修改。 太简单,无需增加修改的系统难看出来设计模式。 面向…

FLUX.1-dev模型本地训练推理教程(GPU/NPU)

模型简介 Flux.1模型是由Black Forest Labs推出的文生图模型套件,具备强大的生成式模型开发能力。该模型由Stable Diffusion的原班人马创立,成员多来自Stable Diffusion的开发团队,因此继承了高水平的模型开发能力。 Flux.1模型包含三个不同…

MATLAB基础应用精讲-【数模应用】负二项回归(附R语言和python代码实现)

目录 前言 几个高频面试题目 负二项回归、Probit回归如何选择 负二项回归 Probit回归 知识储备 逻辑回归 算法原理 多阈值负二项回归模型 模型及估计方法 负二项回归模型 多阈值负二项回归模型 分割阶段 精确估计阈值阶段 ​‌负二项回归的操作步骤 负二项回归…

使用Java API访问Apache Kafka

简介 Kafka是由Apache软件基金会开发的一个开源流处理平台,Kafka是一个功能强大且灵活的平台。 基本情况 软件名称:Apache Kafka 软件平台:跨平台 软件语言:Scala、Java 开发商:Apache软件基金会 软件授权:Apache License 2.0 最近更新时间:2024年7月23日 核心概念 -…