Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “是什么意思?”;管理的;vs";非托管;NET中的资源?_C#_.net_Unmanaged_Managed - Fatal编程技术网

C# “是什么意思?”;管理的;vs";非托管;NET中的资源?

C# “是什么意思?”;管理的;vs";非托管;NET中的资源?,c#,.net,unmanaged,managed,C#,.net,Unmanaged,Managed,在.NET中,术语“托管资源”和“非托管资源”是什么意思?它们是如何形成的?托管资源是那些纯.NET代码的资源,由运行时管理并受其直接控制 非托管资源是指非托管资源。文件句柄、固定内存、COM对象、数据库连接等。术语“非托管资源”通常用于描述不直接受垃圾收集器控制的内容。例如,如果您打开与数据库服务器的连接,这将使用服务器上的资源(用于维护连接),如果提供程序不是完全用托管代码编写的,则可能会使用客户端计算机上的其他非.net资源 这就是为什么对于数据库连接之类的东西,建议您这样编写代码: us

在.NET中,术语“托管资源”和“非托管资源”是什么意思?它们是如何形成的?

托管资源是那些纯.NET代码的资源,由运行时管理并受其直接控制

非托管资源是指非托管资源。文件句柄、固定内存、COM对象、数据库连接等。

术语“非托管资源”通常用于描述不直接受垃圾收集器控制的内容。例如,如果您打开与数据库服务器的连接,这将使用服务器上的资源(用于维护连接),如果提供程序不是完全用托管代码编写的,则可能会使用客户端计算机上的其他非.net资源

这就是为什么对于数据库连接之类的东西,建议您这样编写代码:

using (var connection = new SqlConnection("connection_string_here"))
{
    // Code to use connection here
}

因为这样可以确保对连接对象调用
.Dispose()
,从而确保清除所有非托管资源。

托管资源和非托管资源的基本区别在于 垃圾收集器在某个时间点了解所有托管资源 GC将出现并清理所有相关的内存和资源 使用托管对象。GC不知道非托管资源,例如 作为文件、流和句柄,所以如果您没有在 您的代码将导致内存泄漏和资源锁定


有关详细信息-

托管资源是可以由垃圾收集器释放的资源,而非托管资源不能由垃圾收集器释放。为此,需要析构函数

在问答1中,布鲁斯·伍德发布了以下内容:

我这样看待“托管”和“非托管”两个术语:

“托管”是指.NET沙盒中的任何内容。这包括 所有.NET Framework类

“非托管的”指的是.NET沙盒之外的荒野。这 包括通过调用Win32 API返回给您的任何内容 功能

如果您从未调用Win32 API函数,也从未返回任何Win32 API函数 “handle”对象,则您不持有任何非托管资源。 通过.NET Framework类方法打开的文件和流是 所有托管包装器

注释:您不能直接持有非托管资源。但是,您可能通过托管“包装器类”间接持有非托管资源,如。这样的包装类通常实现(直接实现或通过继承实现)

…许多托管(.NET Framework)对象是 将非托管资源保存在其中,您可能希望 尽可能快地处理它们,或者至少提供给您的来电者 这样做的机会。这就是写你自己的Dispose()的地方 方法进来了。本质上,实现IDisposable()有两个功能 给你的东西:

  • 允许您清除直接从中获取的任何资源 NET背后的操作系统(非托管资源)

  • 允许您和调用者释放大量.NET对象/.NET 在肮脏的小房间里存放着珍贵资源的物体 您/您的来电者希望立即释放的手

  • 注释:通过实现
    IDisposable
    并由此提供
    Dispose()
    方法,您使类的用户能够以确定性的方式释放类实例所持有的任何非托管资源



    1个最初在中共享的链接。引用日期为2005年11月17日的材料。请注意,我只是简单地复制编辑了引用的内容。

    我要稍微澄清一下:“非托管资源”是指如果被丢弃,垃圾收集器将不知道如何清理的资源。例如,即使两个对象都在垃圾收集器的控制下,短寿命对象对来自长寿命对象的事件的订阅也将是非托管资源,因为如果订阅服务器被放弃,而发布服务器未被放弃,GC将无法知道订阅是否应被取消。如果在发布服务器的生命周期内可以创建和放弃无限数量的订阅服务器,则会导致内存泄漏。再澄清一点:SqlConnection(或FileStream等)是托管资源,在内部使用GC不知道的非托管资源。jimvfr是对的,SqlConnection是托管资源的一个示例。非托管资源的一个例子是,当我们需要使用方法Marshal.AllocHGlobal()从非托管内存分配内存时,这是一个非托管资源。在这种情况下,最佳做法是使用析构函数(~ctor)并调用Marshal.FreeHGlobal()“IDisposable界面背后的理念是让您以确定性的方式清理资源,并清理非托管资源。”太棒了!可能重复的