百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

在 C# 中资源回收,你知道要使用哪个吗?

toyiye 2024-09-03 01:05 4 浏览 0 评论

概述:注意,程序员们!有没有偶然发现 C# 中的 Dispose 和 Finalize 方法,想知道它们是怎么回事?让我们深入了解一下。准备好进入 C# 垃圾回收的兔子洞的激动人心的旅程。有没有想过 C# 如何处理代码中未使用或“花费”的对象?输入垃圾回收 (GC)!GC 就像您的个人清洁服务一样,通过处理不再使用的物品来清理不需要的内存空间。C# 语言中的 Dispose 方法#通过解开 Dispose 方法来启动它。Dispose 在 C# 中实现“IDisposable”接口是一种预定义的方法,旨在提高内存管理效率。Dispose 方法有一个关键目的:释放垃圾回收器无法自行处理的非托管资源。简

注意,程序员们!有没有偶然发现 C# 中的 Dispose 和 Finalize 方法,想知道它们是怎么回事?让我们深入了解一下。准备好进入 C# 垃圾回收的兔子洞的激动人心的旅程。

有没有想过 C# 如何处理代码中未使用或“花费”的对象?输入垃圾回收 (GC)!GC 就像您的个人清洁服务一样,通过处理不再使用的物品来清理不需要的内存空间。

C# 语言中的 Dispose 方法#

通过解开 Dispose 方法来启动它。Dispose 在 C# 中实现“IDisposable”接口是一种预定义的方法,旨在提高内存管理效率。

Dispose 方法有一个关键目的:释放垃圾回收器无法自行处理的非托管资源。简单地说,它就像一个记忆解放器,解放了“被困住”的记忆空间!

让我们看一个例子:

public class DisposeExample : IDisposable  
{  
    bool disposed = false;  
  
// Dummy unmanaged resource  
    private IntPtr unmanagedResource;  
    // Implement dispose.  
    public void Dispose()  
    {  
        Dispose(true);  
        GC.SuppressFinalize(this);  
    }  
    protected virtual void Dispose(bool disposing)  
    {  
        if (!disposed)  
        {  
            if (disposing)  
            {  
                /* Here, dispose managed resources. */  
            }  
            // Dispose unmanaged resources.  
            CloseHandle(unmanagedResource);  
            disposed = true;   
        }  
    }  
    ~DisposeExample()  
    {  
        // Simply call Dispose(false).  
        Dispose(false);  
    }  
    [DllImport("Kernel32")]  
    private extern static Boolean CloseHandle(IntPtr handle);  
}

在此示例中,该类实现接口。我们使用该方法来释放资源,并确保 GC 以后不会尝试最终确定对象。DisposeExampleIDisposableDispose()GC.SuppressFinalize(this)

处置方法的实际用例

想知道 Dispose 适合您时尚的 C# 编码工作吗?在处理系统资源处理对象时,通常会执行步骤。想想流、文件、网络连接,甚至是复杂的图形。艺术家,认识你的清理人员!

现在,让我们扩展一些涉及 Dispose 方法的实际场景。

  • 文件处理

// Implement IDisposable.

public class FileHandler : IDisposable  
{  
    // Declare your Filestream object.  
    private FileStream fileStream = null;  
  
public FileHandler(string path)  
    {  
        fileStream = new FileStream(path, FileMode.Open);  
    }  
    public void Dispose()  
    {  
        // Dispose off the Filestream object once it's no longer needed.  
        fileStream?.Dispose();  
    }  
}

在本例中,我们正在处理一个对象。完成读取或写入文件后,我们调用该方法来释放对象。让我们的记忆保持整洁!FileStreamDispose()

  • 数据库连接
public class DatabaseConnector : IDisposable  
{  
    // Declare your SqlConnection object.  
    private SqlConnection sqlConnection = null;  
  
public DatabaseConnector(string connectionString)  
    {  
        sqlConnection = new SqlConnection(connectionString);  
        sqlConnection.Open();  
    }  
    public void Dispose()  
    {  
        // Dispose off the SqlConnection once it's no longer needed.  
        sqlConnection?.Close();  
    }  
}

在 C# 中处理数据库时,Dispose 会更加灵活。在此方案中,我们正在清除一个对象。一旦我们完成数据获取,调用就会确保连接不会不必要地徘徊。SqlConnectionDispose()

  • 图形和图像处理
public class ImageProcessor: IDisposable  
{  
    Image image;  
  
public ImageProcessor(string path)  
    {  
        image = Image.FromFile(path);  
    }  
    // Some processing done here.  
    public void Dispose()  
    {  
        image?.Dispose();  
    }  
}

进入图形数据领域,我们经常使用复杂的对象,这些对象可能会贪婪内存。在这种情况下,该方法有助于在 Image 对象达到其目的后清除它们。Dispose

在我们的 C# 探索路径中,我们遇到的下一个方法是 Finalize 方法,它是 Dispose 的较早且值得信赖的同级方法。Finalize 被标记为针对尚未清理的内存空间的最后一道防线,可以像值得信赖的旧真空吸尘器一样可靠,直到每一寸都被清理干净才停止!让我们做好准备,深入研究 Finalize 方法的复杂性和细微差别及其作为“析构函数”的作用。

发展理解:最终确定方法基础知识

在看到 Finalize 方法的实际应用之前,让我们先对其进行一些分解。简单来说,Finalize 方法是 Microsoft 类提供的析构函数,该方法有助于在函数派对后整理混乱,特别关注清理非托管资源。Object

请看以下示例:

class FinalizeExample  
{  
    // Unmanaged resource  
    IntPtr nativeResource;  
  
~FinalizeExample()  // destructor  
    {  
        // Release the allocated unmanaged resource  
        Marshal.FreeHGlobal(nativeResource);  
    }  
}

在此类中,我们有一个 非托管资源 。标有波浪号 (~) 的析构函数在完成期间释放此非托管资源。FinalizeExamplenativeResource

这是另一种情况:

class FinalizeExample  
{  
    FileStream fileStream;  
  
// Constructor, opens a file named "temp.dat"  
    public FinalizeExample()  
    {  
        fileStream = new FileStream("temp.dat", FileMode.Create);  
    }  
    ~FinalizeExample()  // destructor  
    {  
        // File closing statement  
        fileStream.Close();  
    }  
}

在此代码段中,Finalize 方法关闭对象终结期间,确保释放文件使用的任何系统资源。fileStream

C# 中的 Finalize 方法:性能

“但是这会如何影响我的应用程序的性能?”你可能会问。不要害怕,我们的摇滚明星程序员!在性能方面,Finalize 方法就像一个勤奋的看门人,随时待命以清理任何废弃的内存资源。

有什么好处?优化后端性能,缩短响应时间,从而让用户满意。看到连接了吗?更快的性能意味着用户满意!

但请记住,这里有一个权衡。垃圾回收器需要进行两次传递才能使用终结器清理对象,这可能会导致额外的开销。

现实世界编码中的 Finalize 方法

现在,让我们继续一些实际的东西。在我惊人的代码中,我应该在哪里实现这个 Finalize 方法?它通常与使用非托管资源的类一起发挥作用。很有趣,不是吗?

考虑使用大量 Bitmap 对象的 .NET 应用程序。这些 Bitmap 对象封装了 GDI+,这些 GDI+ 是非托管资源。若要在不再使用这些资源后立即释放这些资源,最好调用 Dispose 方法。但是,在未调用 Dispose 的情况下,析构函数或 Finalize 方法将发挥作用以释放这些 GDI+ 对象。

需要了解的关键是,Finalize 方法并非适用于所有类型的脚本,但在处理非托管资源时更是如此。就像即使是最好的派对有时也会让乐队难忘一样,只要使用得当,时机和时机,Finalize 可能会成为您代码的摇滚明星!

处置与最终确定

女士们,先生们,请戴上代码帽,因为我们即将深入研究一个鲜为人知的领域:C# 中 Dispose 和 Finalize 方法之间的战斗。系好安全带,因为我们将深入研究这两种方法如何相互衡量。

性能:处置与最终确定

“性能为王,”你说?那么处置可能会赢得你的心。调用 Dispose 方法时,会立即释放托管和非托管资源。这增强了代码的性能,因为它将资源从进一步使用中解放出来,例如让您的计算机打个盹,以便它准备好承担下一个任务。

但不要让任何人告诉你 Finalize 是一个慢动作!当然,它是自动的,可以在 GC 过程中工作,但它专注于 Dispose 无法触及的资源。这就像一个超级英雄在其他一切都失败时介入并拯救。

为了清楚起见,让我们深入了解一些代码。请考虑以下场景:代码中有一个对象,用于打开和读取文件,我们将其称为 FileReader:

public class FileReader: IDisposable  
{  
    bool disposed = false;  
    StreamReader file;  
  
public FileReader(string fileName)  
    {  
        file = new StreamReader(fileName);  
    }  
    public void ReadFile()  
    {  
        /* Code to read the file */  
    }  
    public void Dispose()  
    {  
        Dispose(true);  
        GC.SuppressFinalize(this);  
    }  
    protected virtual void Dispose(bool disposing)  
    {  
        if(!disposed)  
        {  
            if (disposing)  
            {  
                file?.Close();  
            }  
            disposed = true;   
        }  
    }  
    ~FileReader()  
    {  
        Dispose(false);  
    }  
}

在此示例中,Dispose 将在我们读取它后立即关闭它,从而使内存管理非常高效。file

另一方面,Finalize 会延迟扫描,以确保最终处理所有未清理的内容。这就像有一个房子清洁工,在今天打扫完你的房子后,下周突然出现,只是为了仔细检查一切是否井井有条!

处置与最终确定用例的示例

让我们让它更具体一点。将 Dispose 想象成泄漏巡逻的海绵。你有没有洒过东西,立即把它吸收起来,然后开始你的一天?这就是在工作中处置!它巡逻,找到泄漏物(未使用的资源),并立即清理它。在代码方面,一旦对象完成其目的,Dispose 就非常适合使用。

public void ProcessFile(string fileName)  
{  
    using (var reader = new FileReader(fileName))  
    {  
        reader.ReadFile();  
    } // Dispose is called here.   
}

在上面的代码中,我们使用了一旦完成工作就会自动调用 Dispose 的语句。usingreader

另一方面,Finalize 就像项目结束后的清理工作。你知道当你粉刷完你的房间时,退后一步欣赏你的作品,然后注意到一些你错过的油漆飞溅吗?这时 Finalize 就进来了!它会在您的代码中漫游,并清除 Dispose 忽略的挥之不去的、不受管理的小斑点。

public class ProcessFile  
{  
    FileReader reader;  
  
public ProcessFile(string fileName)  
    {  
        reader = new FileReader(fileName);  
    }  
    public void ReadFile()  
    {  
        reader.ReadFile();  
        // FileReader destructor will be called sometime after this line, by the GC  
    }  
}

在此示例中,当对象标记为 GC 时,Finalize(析构函数)将确保 的文件已关闭。ProcessFilereader

因此,无论您选择哪种方式,处置或完成,您的代码都会得到妥善处理,就像一个 8 岁的孩子熟练地浏览他们的乐高积木藏匿处一样。这不是一场比赛,而是一对能力很强的二人组,发挥他们的优势,这就是一切的不同之处。

处置与最终确定比较

由于我们喜欢将大量信息打包到一口大小的工具中,因此让我们通过比较表来总结我们的分析。请记住,每个都有自己的优势,并且在不同的场景中非常有用。

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码