C# 中的 dynamic 类型是一种特殊类型,它将类型检查推迟到运行时,而不是在编译时进行。这使得变量可以灵活地处理未知类型或动态变化的成员(如方法、属性),而无需在编译阶段确定其具体结构。
1、编译时与运行时行为:dynamic 变量在编译时被视为静态类型(类似 object),但所有操作(如方法调用、属性访问)的类型检查和成员解析都在运行时完成。如果运行时操作无效(如调用不存在的方法),会抛出运行时异常。
隐式转换:任何类型都可以隐式转换为 dynamic,反之亦然。例如:
dynamic d1 = 7; // 整数转换为 dynamic
dynamic d2 = "hello"; // 字符串转换为 dynamic
int i = d1; // dynamic 转换为 int(运行时检查)
2、 重载决策延迟:当方法调用的参数或接收方类型为 dynamic 时,重载决策在运行时进行。如果运行时类型不匹配,可能引发异常。
3、 与 object 类型的区别:object 类型需要显式转换才能访问成员,而 dynamic 类型允许直接调用成员,转换在运行时自动处理。
4、 处理动态数据:如 JSON、XML 或数据库记录,其中结构可能未知或变化。例如,使用 ExpandoObject 动态添加属性:
dynamic person = new ExpandoObject();
person.Name = "Alice";
person.Age = 30;
Console.WriteLine(person.Name); // 输出: Alice
简化反射代码:避免冗长的反射调用,直接动态调用方法或访问属性。4
COM 互操作:与 COM 对象交互时,减少显式类型转换。1
动态语言集成:通过动态语言运行时(DLR)支持 IronPython、IronRuby 等语言。1
5、性能与注意事项
性能开销:dynamic 的运行时检查会带来性能损失,通常低于静态类型。在性能关键的场景中,应谨慎使用。
类型安全性:由于类型检查延迟,错误可能在运行时才暴露,增加调试难度。建议在需要灵活性的场景(如数据处理、脚本)中使用,并避免在静态类型能胜任的地方滥用。
6、基础示例
dynamic value = "Hello";
Console.WriteLine(value.Length); // 运行时解析为字符串的 Length 属性
value = 123;
Console.WriteLine(value + 456); // 输出: 579(整数加法)
368

被折叠的 条评论
为什么被折叠?



