目录
ps: 用 # 是为了提亮注释颜色,应用 //
using
结构
在 C# 中,using
结构用于确保在代码块结束时释放资源。它主要用于处理实现了 IDisposable
接口的资源(IDisposable
接口只包含一个名为 Dispose()
的方法),这些资源需要在使用完毕后显式释放,以便及时回收内存和清理资源。
using
结构的语法如下:
using (ResourceType resource = new ResourceType())
{
# 使用 resource 对象进行一些操作
# 这个代码块结束后,resource 对象会被自动释放(调用 Dispose 方法)
}
ResourceType
是需要释放资源的类型,它实现了 IDisposable
接口。
在 using
结构内部,我们创建了一个 resource
对象,然后在代码块内对其进行一些操作。当代码块结束时,无论是正常执行还是发生异常,using
结构会自动调用 resource.Dispose()
方法来释放资源。
例子:
using (StreamReader reader = new StreamReader(filePath))
{
string content = reader.ReadToEnd();
Console.WriteLine("文件内容:");
Console.WriteLine(content);
}
# 在此处,using 结构结束,reader 对象会被自动释放(调用 Dispose 方法)
用 using
结构来创建一个 StreamReader
对象来读取文件 "example.txt" 的内容。无论读取文件是否成功,当代码块结束时,StreamReader
对象都会被自动释放,这样可以确保文件资源得到正确释放。
ps:using
结构仅在使用需要显式释放资源的情况下才使用。对于不需要显式释放资源的对象,C# 的垃圾回收机制会自动进行内存管理。
显式释放资源
需要显式释放资源的情况通常涉及与外部系统进行交互的资源,如文件、数据库连接、网络连接、图形界面资源等。这些资源的创建和管理可能涉及非托管资源(由操作系统或外部库分配的资源),在使用完毕后,需要显式释放资源以确保资源的正确释放和回收。
以下是一些需要显式释放资源的情况:
-
文件操作:在读写文件时,使用
FileStream
或StreamReader/StreamWriter
等文件操作类。在完成文件操作后,需要使用using
结构或手动调用Dispose
方法来释放相关资源。 -
数据库连接:使用
SqlConnection
、MySqlConnection
或其他数据库连接类进行数据库操作。在使用完毕后,必须显式关闭数据库连接并释放资源,以避免数据库连接池溢出或资源泄漏。 -
网络连接:在与网络资源进行交互时,使用
HttpClient
、TcpClient
等网络连接类。在完成网络操作后,需要释放网络连接资源。 -
图形界面资源:在使用图形界面库如 Windows Forms 或 WPF 创建界面时,涉及到窗口、图形对象、绘图上下文等资源。在关闭窗口或界面时,需要显式释放这些资源。
-
外部系统调用:在与外部系统进行交互或调用外部库时,可能涉及到资源的分配和管理。在完成操作后,需要适时释放这些资源。
而对于一些托管资源,由于 C# 的垃圾回收机制,它们不需要显式释放资源。以下是一些不需要显式释放资源的对象:
-
纯托管对象:只包含托管代码的类实例,例如自定义的数据结构、简单的数据类型和变量等。
-
字符串:C# 中的字符串类型(
string
)由 CLR 自动管理其内存。 -
集合类:例如
List<T>
、Dictionary<TKey, TValue>
等,当不再使用时,它们的内存会被自动回收。 -
自动分配的局部变量:方法内部声明的局部变量,当超出作用域后会被自动回收。
总之,对于托管资源,C# 的垃圾回收机制会自动管理内存和资源的释放,而对于涉及非托管资源的情况,需要显式释放资源,以确保资源的正确回收和释放。在这些情况下,使用 using
结构或手动调用 Dispose
方法是一种良好的实践。