今天来聊聊C#关键字dynamic,这个是一个非常强大功能,但是没用好,却容易造成灾难的语法。
01
dynamic简介
dynamic可以用来声明为动态对象,表示变量的使用和对其成员的引用绕过编译时类型检查,改为在运行时解析这些操作,这使得在运行时处理未知类型的对象变得更加灵活。
使用dynamic类型可以简化一些操作,比如:COM、动态API(IronPython )、HTML文档对象模型 (DOM) 的访问。
02
使用方法
**示例1:**声明动态对象,并赋值打印。
dynamic d = new System.Dynamic.ExpandoObject();
d.name = "name";
Console.WriteLine(d.name); //name
**示例2:**C#调用python脚本的方法。
//test.py
def pythonMethod():
print("调用Python方法成功!")
//Program.cs
using IronPython.Hosting;
var pythonScriptPath = System.Environment.CurrentDirectory + "\\test.py";
var pyEngine = Python.CreateEngine();
dynamic py = pyEngine.ExecuteFile(pythonScriptPath);
py.pythonMethod(); //调用Python方法成功!
03
优缺点
优点:
**1、简化代码:**减少类型的转换和反射依赖,使代码更加简洁;
**2、动态绑定:**支持动态绑定,根据不同上下文执行不同的代码逻辑;
**3、方便使用:**简化一些复杂丢下的访问,无需关系其具体类型;
**4、方便扩展:**方便扩展程序的功能。
缺点:
1、类型检查:在编译时不会进行类型检查,可能在运行时引发异常;
**2、性能开销:**在运行时需要进行类型检查和转换,性能开销会比较大;
**3、安全性:**由于dynamic可以访问任何类型的属性、方法、字段,如果使用不当,容易导致安全问题;
**4、可读性:**过渡使用,可能会让代码难以理解和维护。
04
最后
根据以上的优缺点分析,dynamic需要根据实际情况权衡利弊,并谨慎使用。
特别是不要用在一些需要团队协作的功能,比如接口,接口的参数和返回结果,应该都是必须满足明确的类型定义,否则容易造成一些灾难性的问题。
由于在编译时不会进行类型检查,很容易导致接口参数和返回结果的变更,编译器无法即时提示,导致代码变得难以维护和使用。
你在写代码中,dynamic会用在什么地方,欢迎留言区评论!
- End -
推荐阅读
.NetCore多租户开源项目,快速后台开发企业框架,赚钱就靠她了