C# 资源管理‌(using 语句)

news/2025/3/21 6:02:07/

using不得不知的使用特点,用好了 大大地提高工作效率!

  • 一、using 语句(资源管理)‌
  • ‌二、using 语句的应用场景‌
  • ‌三、using 语句的底层实现‌
  • ‌四、using 声明(C# 8.0 新特性)‌
  • ‌五、using 指令(命名空间引入)‌
  • ‌六、using 语句的注意事项‌
  • ‌七、最佳实践‌

在 C# 中,using 关键字有两种主要用途:‌资源管理‌(using 语句)和 ‌命名空间引入‌(using 指令)。以下是详细说明及示例:

一、using 语句(资源管理)‌

using 语句用于确保实现了 IDisposable 接口的对象在使用后被正确释放,避免资源泄漏(如文件句柄、数据库连接等)。

‌语法‌

using (ResourceType resource = new ResourceType())
{// 使用 resource 操作资源
} // 离开作用域时自动调用 resource.Dispose()

‌核心特点‌
‌1、自动释放资源‌:无论代码块是否抛出异常,Dispose() 方法都会被调用。
2‌、简化代码‌:避免手动编写 try-finally 块来释放资源。

‌二、using 语句的应用场景‌

‌1. 文件操作‌

using (FileStream fs = new FileStream("file.txt", FileMode.Open))
{byte[] buffer = new byte[1024];int bytesRead = fs.Read(buffer, 0, buffer.Length);
} // 自动关闭文件流,释放文件句柄

‌2. 数据库连接‌

using (SqlConnection connection = new SqlConnection(connectionString))
{connection.Open();// 执行数据库操作
} // 自动关闭连接

‌3. 网络流‌

using (HttpClient client = new HttpClient())
{string result = await client.GetStringAsync("https://example.com");
} // 自动释放 HttpClient 资源

‌三、using 语句的底层实现‌

using 语句会被编译器转换为 try-finally 块,确保资源释放:

// 原代码
using (var resource = new Resource())
{// 操作 resource
}// 等效的编译后代码
Resource resource = new Resource();
try
{// 操作 resource
}
finally
{if (resource != null)((IDisposable)resource).Dispose();
}

‌四、using 声明(C# 8.0 新特性)‌

从 C# 8.0 开始,可以使用更简洁的 using 声明(无需显式代码块):

// 资源在声明的作用域结束时自动释放
using var fs = new FileStream("file.txt", FileMode.Open);
byte[] buffer = new byte[1024];
fs.Read(buffer, 0, buffer.Length);
// 当离开当前方法或代码块时,fs.Dispose() 自动调用

‌五、using 指令(命名空间引入)‌

using 指令用于引入命名空间,简化类型引用:

using System;
using System.IO;public class Program
{public static void Main(){Console.WriteLine("Hello"); // 无需写 System.ConsoleFile.WriteAllText("test.txt", "Hello");}
}

‌特殊用法‌
1、别名引入‌:解决命名冲突。

using MyAlias = MyNamespace.MyClass;

2‌、静态引入‌(C# 6.0+):直接引用静态成员。

using static System.Math;
double x = Sqrt(16); // 无需写 Math.Sqrt

‌六、using 语句的注意事项‌

1‌、对象必须实现 IDisposable‌:否则无法使用 using。

// 错误示例:StringBuilder 未实现 IDisposable
using (var sb = new StringBuilder()) 
{sb.Append("Hello");
}

2‌、避免在 using 块外使用对象‌:

StreamReader reader;
using (reader = new StreamReader("file.txt"))
{// 正确:在 using 块内使用
}
reader.ReadToEnd(); // 错误!reader 已被释放!

3‌、多个资源的嵌套使用‌:

using (var resource1 = new Resource1())
using (var resource2 = new Resource2())
{// 操作 resource1 和 resource2
}

‌七、最佳实践‌

1‌、始终用 using 处理一次性对象‌:避免手动调用 Dispose()。
2‌、优先使用 using 声明(C# 8.0+)‌:简化代码结构。
3‌、结合异常处理‌:

try
{using (var fs = new FileStream("file.txt", FileMode.Open)){// 文件操作}
}
catch (IOException ex)
{Console.WriteLine($"IO错误: {ex.Message}");
}

‌总结‌

用途语法/场景核心目标
using 语句管理 IDisposable 资源(文件、连接等)确保资源释放
using 声明(C# 8.0+) 简化资源管理代码代码简洁性
using 指令引入命名空间或静态成员简化类型引用

掌握 using 的用法可以显著提升代码的健壮性和可维护性,尤其是在处理非托管资源时。


http://www.ppmy.cn/news/1580791.html

相关文章

Redis解决缓存击穿问题——两种方法

目录 引言 解决办法 互斥锁(强一致,性能差) 逻辑过期(高可用,性能优) 设计逻辑过期时间 引言 缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这个时间点对…

网络编程之客户端通过服务器与另外一个客户端交流

服务器使用select模型搭建&#xff0c;客户端1使用线程搭建&#xff0c;客户端2使用poll模型搭建&#xff0c; 使用时需要先运行服务器&#xff0c;具体编译可看我最后的图片 head.h头文件 #ifndef __HEAD_H_ #define __HEAD_H_ #include <stdio.h> #include <string…

基于 Python 爬取 TikTok 搜索数据 Tiktok爬虫(2025.3.17)

1. 前言 在数据分析和网络爬虫的应用场景中&#xff0c;我们经常需要获取社交媒体平台的数据&#xff0c;例如 TikTok。本篇文章介绍如何使用 Python 爬取 TikTok 用户搜索数据&#xff0c;并解析其返回的数据。 结果截图 2. 项目环境准备 在正式运行代码之前&#xff0c;我…

K8s集群的环境部署

1.测试环境所需要的主机名和IP和扮演的角色 harbor 172.25.254.200 harbor仓库 k8s-master 172.25.254.100 k8s集群控制节点 k8s-node1 172.25.254.10 k8s集群工作节点 k8s-node2 172.25.254.20 k8集群工作节点 注意&#xff1a;所有节点禁用selinux和防火墙 所有节点同步…

【Linux我做主】基础命令完全指南上篇

Linux基础命令完全指南【上篇】 Linux基础命令完全指南github地址前言命令行操作的引入Linux文件系统树形结构的根文件系统绝对路径和相对路径适用场景Linux目录下的隐藏文件 基本指令目录和文件相关1. ls2. cd和pwdcdpwd 3. touch4. mkdir5. cp6. mv移动目录时覆盖写入的两种特…

React第三十章(css原子化)

原子化 css 什么是原子化 css 原子化 CSS 是一种现代 CSS 开发方法&#xff0c;它将 CSS 样式拆分成最小的、单一功能的类。比如一个类只负责设置颜色&#xff0c;另一个类只负责设置边距。这种方式让样式更容易维护和复用&#xff0c;能提高开发效率&#xff0c;减少代码冗余…

Python----计算机视觉处理(Opencv:形态学变换)

一、形态学变化 形态学变换&#xff08;Morphological Transformations&#xff09;是一种基于形状的图像处理技术&#xff0c;主要处理的对象为二值化图像。 形态学变换有两个输入和一个输出&#xff1a;输入为原始图像和核&#xff08;即结构化元素&#xff09;&#xff0c;输…

【Leetcode刷题随笔】206.反转链表

1.题目简介 翻转一个单链表&#xff0c;示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL。 原题链接&#xff1a;206.反转链表. 2.解法思路 要反转一个链表&#xff0c;可以定义一个新的链表来实现反转&#xff0c;但是内存空间消…