Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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# 非托管资源究竟是什么?_C#_Unmanaged - Fatal编程技术网

C# 非托管资源究竟是什么?

C# 非托管资源究竟是什么?,c#,unmanaged,C#,Unmanaged,我想了解非托管资源。 有谁能给我一个基本的想法吗?托管资源和非托管资源的基本区别在于 垃圾收集器在某个时间点了解所有托管资源 GC将出现并清理所有相关的内存和资源 使用托管对象。GC不知道非托管资源,例如 作为文件、流和句柄,所以如果您没有在 您的代码将导致内存泄漏和资源锁定 请随意阅读全文。托管资源和非托管资源的基本区别在于 垃圾收集器在某个时间点了解所有托管资源 GC将出现并清理所有相关的内存和资源 使用托管对象。GC不知道非托管资源,例如 作为文件、流和句柄,所以如果您没有在 您的代码将导

我想了解非托管资源。
有谁能给我一个基本的想法吗?

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


请随意阅读全文。

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


<> >从.NET运行时(CLR)(非.NET代码)运行的那些非托管资源,例如,调用Win32 API中的DLL,或调用C++编写的.dll。

非托管资源是运行在.NET运行时(CLR)之外的那些(例如非.NET代码)。在Win32 API中调用DLL,或者调用C++编写的.dll。

托管资源基本上是指垃圾回收器管理的“托管内存”。当您不再有对托管对象(使用托管内存)的任何引用时,垃圾收集器将(最终)为您释放该内存

非托管资源就是垃圾收集器所不知道的一切。例如:

  • 打开文件
  • 开放网络连接
  • 非托管内存
  • 在XNA中:顶点缓冲区、索引缓冲区、纹理等
通常,您希望在丢失对管理这些资源的对象的所有引用之前释放这些非托管资源。通过对该对象调用
Dispose
,或者(在C#)使用
using
语句来完成此操作,该语句将为您处理调用
Dispose

如果您忽略了正确处置非托管资源的
,垃圾收集器最终将在垃圾收集包含该资源的对象时为您处理该资源(这是“终结”)。但是,由于垃圾收集器不知道非托管资源的情况,所以它无法判断需要释放它们的程度-因此,您的程序可能会执行得很差或完全耗尽资源


如果您自己实现了一个处理非托管资源的类,则由您来正确实现
Dispose
Finalize

托管资源基本上是指由垃圾收集器管理的“托管内存”。当您不再有对托管对象(使用托管内存)的任何引用时,垃圾收集器将(最终)为您释放该内存

非托管资源就是垃圾收集器所不知道的一切。例如:

  • 打开文件
  • 开放网络连接
  • 非托管内存
  • 在XNA中:顶点缓冲区、索引缓冲区、纹理等
通常,您希望在丢失对管理这些资源的对象的所有引用之前释放这些非托管资源。通过对该对象调用
Dispose
,或者(在C#)使用
using
语句来完成此操作,该语句将为您处理调用
Dispose

如果您忽略了正确处置非托管资源的
,垃圾收集器最终将在垃圾收集包含该资源的对象时为您处理该资源(这是“终结”)。但是,由于垃圾收集器不知道非托管资源的情况,所以它无法判断需要释放它们的程度-因此,您的程序可能会执行得很差或完全耗尽资源

如果您自己实现了一个处理非托管资源的类,那么您需要正确地实现
Dispose
Finalize

非托管资源不是一件事,而是一种责任。如果一个对象拥有一个非托管资源,这意味着(1)该对象外部的某个实体已被操作,如果未清理,可能会导致问题,(2)该对象拥有执行此类清理所需的信息,并负责进行清理

尽管许多类型的非托管资源与各种类型的操作系统实体(文件、GDI句柄、分配的内存块等)有着密切的关联,但除了清理的责任外,没有一种实体是由所有这些实体共享的。通常,如果一个对象有责任执行清理,它将有一个Dispose方法,该方法指示它执行它负责的所有清理

在某些情况下,对象会考虑到可能在没有任何人先调用Dispose的情况下放弃它们。GC允许对象请求通知它们已被放弃(通过调用名为Finalize的例程),对象可以使用此通知自己执行清理

不幸的是,“托管资源”和“非托管资源”等术语被不同的人用来表示不同的东西;坦率地说,从对象的角度考虑,更有用的方法是不承担任何清理责任,承担只有在调用Dispose时才会承担的清理责任,或者承担应该通过Dispose来承担的清理责任,但也可以通过Finalize来承担。

一种“非托管资源”这不是一件事,而是一种责任。如果是产科医生