当前位置: 首页 > article >正文

C# 下 using 块的作用 + VS2022 下 using 语法糖怎样工作

🔍 using 的本意是什么?

using 是 C# 中用于 自动释放资源 的语法糖,适用于实现了 IDisposable 接口的对象(比如数据库连接、文件、网络流等)。

🧐 首先看下SqlSugarClient类部分源码:

SqlSugarClient类 确实 实现了 IDisposable 接口,并且实现了IDisposable里面Void Dispose()方法。

📝 SqlSugarClient类实现了IDisposable接口:

 📝 SqlSugarClient类实现了Dispose方法:

 📝 IDisposable接口里Dispose方法的声明:


🔍 接下来在 using 关键字处 hover 下

可以看到当鼠标hover到using关键字的时候直接定位到了SqlSugarClient类实现了的Dispose方法。

 

❓ 这里有疑问,为什么hover到using关键字后会直接定位到SqlSugarClient.Dispose()呢?按F12又会直接定位到SqlSugarClient.Dispose()方法具体实现。根本看不懂using是咋做到的。常规思路想using是个函数,括号里是参数,using方法里帮忙转调Dispose。

📝 来看看AI怎么说:

🧠 那么 using 是如何工作的呢?

以你写的这段代码为例:

using (SqlSugarClient dbClient = SqlSugarInstance.GetInstance())
{// do something
}

在编译后,相当于变成了这样👇(可以理解为 using 背后的真实实现):

SqlSugarClient dbClient = SqlSugarInstance.GetInstance();
try
{// do something
}
finally
{if (dbClient != null)((IDisposable)dbClient).Dispose();
}

✅ 所以总结:

  • using 本质是语法糖,不能 F12 看到它本身的实现。

  • 它会在编译阶段转换为 try-finally 并调用 Dispose()

  • 你可以通过 Sharplab.io 这种在线工具来看到编译器“反糖”的结果(即:C# 源代码编译后生成的 IL 或自动展开的样子)。


🔍 想自己验证一下?

你可以把这段代码贴进 SharpLab:

using System;
public class Test
{public static void Main(){using (var resource = new MyDisposable()){Console.WriteLine("Inside using block");}}
}public class MyDisposable : IDisposable
{public void Dispose(){Console.WriteLine("Disposed");}
}

然后选中“C# -> Decompiled C#”或者“C# -> IL”,就能看到使用 try/finally 的样子了。

✅ 如下:终于看到了语法糖是怎样工作的。


✅ using 的主要好处

1. 自动释放资源,防止资源泄露

  • 不手动调用 .Dispose() 容易忘记,导致连接没释放、文件没关闭、内存泄漏。

  • using 自动帮你搞定这一切。


2. 代码简洁,逻辑清晰

  • using 把资源的生命周期限定在一块区域内,一目了然。


3. 线程安全 & 稳定性

  • 即使发生异常(比如查询失败),finally 中的 .Dispose() 依然会被调用,确保资源能安全释放


❗但使用 using 的时候要注意:

不能返回依赖该资源的对象

public SqlCommand GetCommand()
{using (var conn = new SqlConnection(...)){var cmd = conn.CreateCommand(); // cmd 依赖 connreturn cmd; // ❌ conn 被释放,cmd 也无法用了}
}

这就像你关了煤气罐,还想继续煮饭——锅还在,火没了 😂


💡 提示 & 建议

SharpLab 是一个很棒的工具,但它确实有一个限制:不支持你自己引入外部 NuGet 包或引用复杂的第三方库(比如 SqlSugarClient)。它更适合用于观察 C# 核心语法糖的转换,比如 using, async/await, lock,LINQ 表达式等。

https://sharplab.io/

仅供学习参考

相关文章:

C# 下 using 块的作用 + VS2022 下 using 语法糖怎样工作

🔍 using 的本意是什么? using 是 C# 中用于 自动释放资源 的语法糖,适用于实现了 IDisposable 接口的对象(比如数据库连接、文件、网络流等)。 🧐 首先看下SqlSugarClient类部分源码: SqlSug…...

实体店的小程序转型之路:拥抱新零售的密码-中小企实战运营和营销工作室博客

实体店的小程序转型之路:拥抱新零售的密码-中小企实战运营和营销工作室博客 在当今数字化浪潮的冲击下,实体店面临着前所未有的挑战,但小程序的出现为实体店转型新零售带来了新的曙光。先来看一组惊人的数据,据相关统计&#xff…...

UML 类图基础和类关系辨析

UML 类图 目录 1 概述 2 类图MerMaid基本表示法 3 类关系详解 3.1 实现和继承 3.1.1 实现(Realization)3.1.2 继承/泛化(Inheritance/Generalization) 3.2 聚合和组合 3.2.1 组合(Composition)3.2.2 聚…...

15.三数之和(LeetCode)java

个人理解: 1.使用双指针做法,首先对数组进行排序 第一重for循环控制第一个数,对数组进行遍历。双指针初始化为lefti1, rigthnums.length-1。然后使用while循环移动双指针寻找合适的数。因为返回的是数,不是下标,数不能…...

Spark读取Apollo配置

--conf spark.driver.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 --conf spark.executor.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 在spark的提交命令中&…...

如何通过 Websoft9 应用自托管平台一键安装任意版本 Odoo?

手工安装 Odoo 的复杂流程 环境准备阶段:安装 Docker 需熟悉 Linux 系统操作,需配置软件源、解决依赖冲突; 镜像获取阶段:从 Docker Hub 拉取官方镜像时可能因网络问题失败,且需自行验证版本兼容性; 容器…...

Anaconda3使用conda进行包管理

一、基础包管理操作 ‌安装包‌ 使用 conda install <包名> 安装指定包&#xff0c;支持多包批量安装和版本指定&#xff1a; conda install numpy # 安装单个包 conda install numpy scipy pandas # 批量安装多个包 conda install numpy1.21 # 指定版本 conda instal…...

exec和spawn

前言 需求&#xff1a;做一个electron应用&#xff0c;用node打开exe软件&#xff0c;打开后返回成功与否&#xff0c;打开的软件不会随electron应用的关闭而关闭 exec exec 第一个参数为要运行的command命令&#xff0c;参数以空格分隔。 child_process.exec(command[, opti…...

整平机:精密制造的“隐形守护者”

在金属加工车间里&#xff0c;一块表面凹凸不平的钢板经过一组高速旋转的辊轮后&#xff0c;神奇地变得如镜面般平整——这看似简单的场景背后&#xff0c;隐藏着现代工业对材料精度近乎苛刻的追求。整平机&#xff0c;这个常被忽视的工业设备&#xff0c;实则是高端制造业的基…...

Lesar: 面向 Lustre/Scade 语言的形式化模型检测工具

在《同步反应式系统》的第一课中&#xff0c;介绍了同步数据流语言 Lustre 生态中的形式化模型检查器 Lesar 的用法。Lesar 可对 lustre v4 语言以及 Scade 语言中部分数据流核心特性进行模型检查。 Lesar 介绍 Lesar 是 Verimag 研发维护的形式化方法模型检查工具。该工具的理…...

C++中的vector和list的区别与适用场景

区别 特性vectorlist底层实现动态数组双向链表内存分配连续内存块非连续内存块随机访问支持&#xff0c;通过索引访问&#xff0c;时间复杂度O(1)不支持&#xff0c;需遍历&#xff0c;时间复杂度O(n)插入/删除末尾操作效率高&#xff0c;时间复杂度O(1)任意位置操作效率高&am…...

VRRP与防火墙双机热备实验

目录 实验一&#xff1a;VRRP负载均衡与故障切换 实验拓扑​编辑一、实验配置步骤 1. 基础网络配置 2. VRRP双组配置 二、关键验证命令 1. 查看VRRP状态 2. 路由表验证 三、流量分析 正常负载均衡场景&#xff1a; 故障切换验证&#xff1a; 实验二&#xff1a;防火…...

win11什么都不动之后一段时间黑屏桌面无法显示,但鼠标仍可移动,得要熄屏之后才能进入的四种解决方法

现象&#xff1a; 1. 当时新建运行的资源管理器的任务卡了或者原本资源管理器卡了 比如&#xff1a;当时在文本框中输入explorer 注&#xff1a;explorer.exe是Windows的文件资源管理器&#xff0c;它用于管理Windows的图形外壳&#xff0c;包括桌面和文件管理 按住CtrlAltEs…...

【前端】【业务场景】【面试】在前端开发中,如何优化 SVG(可缩放矢量图形)的性能,特别是在处理复杂图形和动画时

SVG 性能优化&#xff1a;循序渐进 4 步法 目标&#xff1a;先减负 → 再复用 → 后加速 → 最后按场景微调 ① 精简—把包袱先丢掉 删除无用元素 隐藏/被遮挡的 <path>、未引用的 <defs> 里渐变、滤镜。 合并路径 同填充色或描边的路径 ⇒ SVGO / SVGOMG「Mer…...

基于LAB颜色空间的增强型颜色迁移算法

本文算法使用Grok完成所有内容&#xff0c;包含算法改进和代码编写&#xff0c;可大大提升代码编写速度&#xff0c;算法改进速度&#xff0c;提供相关idea&#xff0c;提升效率&#xff1b; 概述 本文档描述了一种基于LAB颜色空间的颜色迁移算法&#xff0c;用于将缩略图D的…...

基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 单自由度磁悬浮减振器工作原理简介 4.2 SIMMECHANICS工具箱 5.完整工程文件 1.课题概述 基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真。其中&#xff0c;SIMMECHANICS是M…...

河北省大数据应用创新大赛样题

** 河北省大数据应用创新大赛样题 ** 1. 在Linux下安装Java并搭建完全分布式Hadoop集群。在Linux终端执行命令“initnetwork”&#xff0c;或双击桌面上名称为“初始化网络”的图标&#xff0c;初始化实训平台网络。 【数据获取】 使用wget命令获取JDK安装包&#xff1a; “w…...

RabbitMQ 的专业术语

术语定义示例/说明生产者&#xff08;Producer&#xff09;发送消息到 RabbitMQ 的客户端应用程序。日志系统将错误信息发送到 RabbitMQ。消费者&#xff08;Consumer&#xff09;从 RabbitMQ 队列中接收并处理消息的客户端应用程序。一个订单处理服务从队列中读取消息并更新数…...

【教程】安装 iterm2 打造漂亮且高性能的 mac 终端

【教程】安装 iterm2 打造漂亮且高性能的 mac 终端_mac 安装iterm2-CSDN博客 全面解析&#xff1a;Github网站无法访问的解决方法! 安装myzh 参考文章&#xff1a;https://blog.csdn.net/qq_44741467/article/details/135727124 下载地址&#xff1a;GitCode - 全球开发者的开源…...

redis特性及应用场景

文章目录 什么是redis&#xff1f;热库redis作为热库的特性redis适用场景 什么是redis&#xff1f; redis在系统架构中的位置就是冷热分离架构的热数据库位置&#xff0c; redis就是热库&#xff0c; 我们一般说缓存数据库。 其他的像MySQL、SQL Server这种关系数据库、MongoDB…...

算法 | 鲸鱼优化算法(WOA)原理,公式,应用,算法改进研究综述,完整matlab代码

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 鲸鱼优化算法 一、原理与公式二、应用领域三、算法改进研究四、完整MAT…...

前端面试常见部分问题,及高阶部分问题

面试中也极有可能让你徒手写代码,无聊的面试问题o( ̄︶ ̄)o 一、HTML/CSS 基础与进阶 常见问题 什么是语义化标签?有哪些常用语义化标签? 答案:语义化标签是指具有明确含义的 HTML 标签,如 <header>、<footer>、<article>、<section> 等。它们有…...

C++初登门槛

多态 一、概念 多态是指不同对象对同一消息产生不同响应的行为。例如&#xff0c;蓝牙、4G、Wi-Fi 对“发送数据”指令有不同的具体实现。 二、核心理解 本质&#xff1a;通过基类指针或引用操作子类对象&#xff0c;实现运行时动态绑定。 表现形式&#xff1a; 接口统一&a…...

C/C++线程详解

一、C语言线程创建&#xff08;POSIX线程&#xff09; 1. 基本创建方法 POSIX线程&#xff08;pthread&#xff09;是C语言中创建线程的标准API&#xff1a; #include <pthread.h> #include <stdio.h>void* thread_func(void* arg) {printf("Thread runnin…...

红队系列-网络安全知识锦囊-CTF(持续更新)

CTF CTF系列-AWD专题篇CTF-比赛培训基础1 CTF 介绍HTTP协议分析进阶001.CTF简介_宽字节注入高级 2018CTF——黑客大赛特训CTF-PWNPWNCTF竞赛中的主要题型之一了解CTF Capture The Flag 夺旗描述:# gets从标准输入设备读字符串函数#下面是对main函数中的汇编代码的解释:modifi…...

Windows环境下常用网络命令使用

ipconfig命令使用&#xff1a; ipconfig可用于显示当前的TCP/IP配置的设置值&#xff0c;通常是用来检验人工配置的TCP/IP设置是否正确。在网络连接出现问题时&#xff0c;可以使用ipconfig /release和ipconfig /renew命令来刷新IP地址&#xff0c;这通常能解决因IP地址冲突或…...

双系统下 ubuntu 20.04 突然 开机黑屏报错 hdaudioC0D2: unable to configure disabling

双系统下 ubuntu 20.04 突然 开机黑屏报错 hdaudioC0D2: unable to configure disabling 简介:今天在开实验室开双系统台式机时,ubuntu 20.04 系统下,突然在某次关机后再开机时,本来启动好好的,但是在进行图形化启动时,本来应该是显示输入账号和密码时,直接黑屏报错了,…...

easyExcel导入导出convert

easyExcel版本2.2.7&#xff0c;3.0及以上使用不一致 类上加注解 ExcelProperty(value "下发类型",converter ComponentPurchaseBomExceladvanceStatusConvert.class)private Integer advanceStatus; 转换类 import com.alibaba.excel.converters.Converter; impo…...

C语言高频面试题——指针函数和函数指针的区别

在 C 语言中&#xff0c;指针函数 和 函数指针 是两个容易混淆的概念&#xff0c;但它们的功能和用途完全不同。以下是详细的对比分析&#xff0c;帮助你彻底理解它们的区别。 1. 指针函数&#xff08;Function Returning a Pointer&#xff09; 定义 指针函数 是一个返回值为…...

软考中级-软件设计师 知识点速过1(手写笔记)

第一章&#xff1a;数值及其转换 没什么可说的&#xff0c;包括二进制转八进制和十六进制 第二章&#xff1a;计算机内部数据表示 真值和机器数&#xff1a; 原码&#xff08;后面都拿x -19举例) &#xff1a; 反码&#xff1a; 补码&#xff1a; 移码&#xff1a; 定点数…...