簡體   English   中英

如何在C#中銷毀/收集非托管對象

[英]How unmanaged object is destroyed/collected in C#

這是一個場景:
在托管c ++ dll中定義了一個類,並在C#項目中使用了該類。

public ref class AClass {
// ......
  XParameters m_oParams;
  property XParameters^ Parameters {
           XParameters^ get() { return m_oParams; }
        }

}

XParameters是C#端可見的另一個托管的c ++定義的類。

C#代碼如下所示:

var aClass = new AClass();
var oParams = aClass.Parameters;
aClass = null;

實際上,我想保證在將null分配給aClass對象本身后, oParams會變為null。 有辦法嗎?

調用aClass = null時會發生什么?

“當aClass = null時到底會發生什么?”: aClass變為null ,並且如果aClass引用的對象是對對象的最后引用,則該對象才有資格使用GC(但這是隱式的效果-現在沒有對GC的標記) ”)。

有沒有辦法讓對象知道什么時候變得適合GC(因為它是隱含動作),還是以實例的引用改為空/其他物體。 因此,沒有辦法“保證在我為aClass分配null之后,oParams會變為null”。

aClass = null ,它現在是一個null引用。 它不會改變oParams。 在C#中,使用后無需將對象設置為null。

在這種情況下,最好將代碼包裝為使用狀態。

using (var aClass = new AClass()){
   var oParams = aClass.Parameters;
   //do stuff
};//object is disposed

如果將代碼包裝在try..finallyusing()塊中,則該對象上的finalizer方法應為您調用Dispose()

可以在以下位置找到有關C#中內存管理的良好資源: http : //codebetter.com/karlseguin/2008/04/28/foundations-of-programming-pt-7-back-to-basics-memory/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM