Visual Studio中的 var 和 dynamic

目录

一、var

1.基础介绍

2.语法模板

二、dynamic

1.基础介绍

2.语法模板

三、两者关键区别--示例

四、核心特点对比

五、注意事项

var的注意事项

dynamic的注意事项

六、选择情况


一、var

1.基础介绍

var:隐式类型局部变量

  • 定义 :编译时由编译器根据初始化值自动推断变量类型,编译后等同于显式声明类型 (如int/string)。
  • 核心特性
    • 仅适用于局部变量 (方法内),不能用于字段、参数或返回值。
    • 必须立即初始化(否则编译器无法推断类型)。
    • 类型一旦确定,后续赋值必须与推断类型一致(编译时类型安全)。

2.语法模板

// 语法:var 变量名 = 初始化值;

var number = 10; // 推断为int var

message = "Hello"; // 推断为string var

list = new List<int>(); // 推断为List<int>

二、dynamic

1.基础介绍

dynamic:动态类型

  • 定义 :完全跳过编译时类型检查,运行时通过反射解析类型和调用成员(类似JavaScript的弱类型)。
  • 核心特性
    • 可用于局部变量、字段、参数、返回值。
    • 无需初始化即可声明,但调用未定义的成员会抛出RuntimeBinderException(运行时错误)。
    • 常用于COM互操作 (如Office自动化)、动态语言交互 (如Python/JavaScript)或简化复杂类型声明(如匿名类型嵌套)

2.语法模板

// 语法:dynamic 变量名; 或 dynamic 变量名 = 初始值;

dynamic obj = new ExpandoObject(); // 动态对象

obj.Name = "Alice"; // 运行时添加属性

obj.Age = 30;

// 调用动态方法(编译时不检查是否存在)

dynamic calculator = GetCalculator();

var result = calculator.Add(1, 2); // 运行时解析Add方法

三、两者关键区别--示例

// var的编译时安全

var str = "Test";

str = 123; // ❌ 编译错误:无法将int赋值给string

// dynamic的运行时风险

dynamic d = "Test";

d = 123; // ✅ 运行时允许类型变更

d.Length; // ❌ 运行时错误:int没有Length属性

四、核心特点对比

|------------|-----------------|----------------------|
| 对比维度 | var | dynamic |
| 类型检查时间 | 编译时(静态类型) | 运行时(动态类型) |
| 使用场景 | 简化局部变量声明(如匿名类型) | COM互操作、动态语言交互、灵活类型处理 |
| 类型安全性 | 编译时安全(类型错误直接报错) | 运行时风险(可能抛出绑定异常) |

五、注意事项

var的注意事项

1.必须初始化 :声明时必须赋值(如var x;编译错误);

2.不能用于字段/参数 :仅允许局部变量(方法内);

3.可读性优先:避免过度使用导致类型模糊。

dynamic的注意事项

1.运行时错误风险 :调用不存在的方法**/** 属性会抛出RuntimeBinderException,需用try-catch处理;

2.性能损耗:每次访问动态成员都会触发反射,频繁使用会降低性能;

3.调试困难 :动态类型的错误只能在运行时发现,增加调试复杂度。

六、选择情况

使用 var的情况:当类型明确且冗长(如List<Dictionary<string, int>>)。

使用 dynamic 的情况:当需要与动态语言或COM组件交互,或处理编译时未知的类型。

相关推荐
2601_9620725514 小时前
李梦娇常识4600问|题库|打印版
sql·华为od·华为·c#·华为云·.net·harmonyos
阿米亚波14 小时前
【Windows】QEMU 启动 openEuler aarch64/arm64 架构系统 + 离线软件源
linux·windows·经验分享·笔记·架构·arm
自传.15 小时前
尚硅谷 Vibe Coding|第三章(1) Claude Code深度使用与进阶技巧 学习笔记
笔记·学习·尚硅谷·vibecoding
.千余16 小时前
【C++】模板进阶全解:非类型参数|全特化|偏特化|分离编译完全指南
开发语言·c++·笔记·学习·其他
自传.16 小时前
尚硅谷 Vibe Coding|第二章 AI编程工具生态 学习笔记
笔记·学习·ai编程·尚硅谷·vibe coding
m0_5474866616 小时前
《C#语言程序设计与实践》 全套PPT课件
c语言·c#·c语言程序设计
秋波。未央17 小时前
Java Agent 开发 · Day 1 学习笔记(含作业完整标准答案)
java·笔记·学习
中屹指纹浏览器17 小时前
2026指纹浏览器字体指纹、字体渲染偏差检测与全维度虚拟字体池搭建方案
经验分享·笔记
叶帆17 小时前
【YFIOs】用C#开发硬件之设备上云
开发语言·unity·c#