c# 知识点查漏补缺(自用)

目录

using 结构

显式释放资源


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# 的垃圾回收机制会自动进行内存管理。

显式释放资源

需要显式释放资源的情况通常涉及与外部系统进行交互的资源,如文件、数据库连接、网络连接、图形界面资源等。这些资源的创建和管理可能涉及非托管资源(由操作系统或外部库分配的资源),在使用完毕后,需要显式释放资源以确保资源的正确释放和回收。

以下是一些需要显式释放资源的情况:

  1. 文件操作:在读写文件时,使用 FileStreamStreamReader/StreamWriter 等文件操作类。在完成文件操作后,需要使用 using 结构或手动调用 Dispose 方法来释放相关资源。

  2. 数据库连接:使用 SqlConnectionMySqlConnection 或其他数据库连接类进行数据库操作。在使用完毕后,必须显式关闭数据库连接并释放资源,以避免数据库连接池溢出或资源泄漏。

  3. 网络连接:在与网络资源进行交互时,使用 HttpClientTcpClient 等网络连接类。在完成网络操作后,需要释放网络连接资源。

  4. 图形界面资源:在使用图形界面库如 Windows Forms 或 WPF 创建界面时,涉及到窗口、图形对象、绘图上下文等资源。在关闭窗口或界面时,需要显式释放这些资源。

  5. 外部系统调用:在与外部系统进行交互或调用外部库时,可能涉及到资源的分配和管理。在完成操作后,需要适时释放这些资源。

而对于一些托管资源,由于 C# 的垃圾回收机制,它们不需要显式释放资源。以下是一些不需要显式释放资源的对象:

  1. 纯托管对象:只包含托管代码的类实例,例如自定义的数据结构、简单的数据类型和变量等。

  2. 字符串:C# 中的字符串类型(string)由 CLR 自动管理其内存。

  3. 集合类:例如 List<T>Dictionary<TKey, TValue> 等,当不再使用时,它们的内存会被自动回收。

  4. 自动分配的局部变量:方法内部声明的局部变量,当超出作用域后会被自动回收。

总之,对于托管资源,C# 的垃圾回收机制会自动管理内存和资源的释放,而对于涉及非托管资源的情况,需要显式释放资源,以确保资源的正确回收和释放。在这些情况下,使用 using 结构或手动调用 Dispose 方法是一种良好的实践。

猜你喜欢

转载自blog.csdn.net/m0_55074196/article/details/131828342