【基础】c# FileStream 对象不会自动释放

c# FileStream 对象不会自动释放

      • [1. 使用 `using` 语句](#1. 使用 using 语句)
      • [2. 显式调用 `Dispose` 或 `Close`](#2. 显式调用 DisposeClose)
      • 注意
      • 总结

在 C# 中, FileStream 对象不会自动释放资源。如果没有正确释放,可能导致文件句柄未关闭,从而导致资源泄露。因此,推荐以下两种方式管理 FileStream 的生命周期:


1. 使用 using 语句

using 语句会确保 FileStream 对象在作用域结束时自动释放资源,无论是否发生异常。

csharp 复制代码
using System.IO;

class Program
{
    static void Main()
    {
        string path = "example.txt";

        // 使用 using 确保 FileStream 自动释放
        using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
        {
            // 进行文件读写操作
            byte[] data = new byte[] { 1, 2, 3, 4 };
            fs.Write(data, 0, data.Length);
        } // 离开 using 块时自动调用 Dispose()
    }
}

2. 显式调用 DisposeClose

可以显式调用 Dispose 方法或 Close 方法来释放资源(两者作用相同),但需要注意确保在任何情况下都能调用。

csharp 复制代码
using System.IO;

class Program
{
    static void Main()
    {
        string path = "example.txt";
        FileStream fs = null;

        try
        {
            fs = new FileStream(path, FileMode.OpenOrCreate);
            // 进行文件读写操作
            byte[] data = new byte[] { 1, 2, 3, 4 };
            fs.Write(data, 0, data.Length);
        }
        finally
        {
            // 确保资源释放
            fs?.Dispose();
        }
    }
}

注意

  • 在 .NET Core 和 .NET 5+ 中,垃圾回收器最终会调用 FileStream 的析构函数来释放资源,但这通常是不可预测的,可能导致文件句柄在较长时间后才被释放。
  • 正确使用 using 或显式调用 Dispose 是最佳实践。

总结

FileStream 对象不会自动释放资源。为避免资源泄露,应使用 using 语句或显式调用 Dispose 方法来释放文件流资源。

相关推荐
o0向阳而生0o3 小时前
28、.NET 中元数据是什么?
microsoft·c#·.net
niuTaylor4 小时前
Linux驱动开发快速上手指南:从理论到实战
linux·运维·开发语言·驱动开发·c#
军训猫猫头4 小时前
89.WPF 中实现便捷的数字输入框:DecimalUpDown 控件的使用 WPF例子 C#例子.
开发语言·c#·wpf
冰茶_6 小时前
.NET MAUI 发展历程:从 Xamarin 到现代跨平台应用开发框架
学习·microsoft·微软·c#·.net·xamarin
The Future is mine7 小时前
C# new Bitmap(32043, 32043, PixelFormat.Format32bppArgb)报错:参数无效,如何将图像分块化处理?
开发语言·c#
Iotfsd14 小时前
.NET写的开源工业物联网网关(IoTGateway)
物联网·c#·.net·dotnet·边缘网关·雾计算·工业物联网智能网关
先生沉默先15 小时前
c#接口_抽象类_多态学习
开发语言·学习·c#
江沉晚呤时15 小时前
深入了解C# List集合及两种常见排序算法:插入排序与堆排序
windows·sql·算法·oracle·c#·排序算法·mybatis
iReachers15 小时前
使用命令行加密混淆C#程序
开发语言·c#
[太阳]8816 小时前
Kafka命令行的使用/Spark-Streaming核心编程(二)
c#·linq