2011-10-02 26 views
0

我有一個類需要來自xml文件的信息。我還有另一個課程是爲滿足這個需求而構建的。一旦需要的信息在第一課,我希望xml讀取器被垃圾收集。垃圾回收和屬性語法

現在,xml讀取器獲取所需的信息並將其存儲在專用字段中。第一類查詢這些字段並檢索信息。我知道,如果我使用xml閱讀器中提供的函數來查詢字段,那麼將沒有剩餘鏈接,如果我在xml閱讀器中使用屬性,這也會是這種情況嗎?

public float Var 
{ 
    get { return someVar; } 
    set { someVar = value; } 
} 
+0

XML讀取器是另一個類的成員變量嗎?或者它是一個成員方法範圍內的局部變量? –

+0

XmlReader類從調用類的構造函數中調用。如果我使用直接函數來獲取XmlReader中保存的變量,那麼一旦調用類構造函數完成,我將確保所有對XmlReader的引用都將丟失。我不知道的是,屬性語法是否會將調用類中的變量鏈接到XmlReader中的變量,即保留引用。 – ste3e

回答

0

如果你有到XmlReader的引用(例如,在你的類中的字段),它不能作爲垃圾回收,而擁有實例還活着。

一旦你沒有任何引用它,它將被垃圾收集。

+0

我想你告訴我,屬性語法就像一個鏈接,因此,只要調用類中的變量通過XmlReader的屬性語法填充的值是活的,那麼XmlReader也是如此。 – ste3e

+0

@StephenJones:錯了。屬性只是一個名爲'get_Var'的方法;它對GC沒有任何影響。 – SLaks

+0

我想我們需要一個明確的答案。據我瞭解,屬性語法不僅僅是一個名爲get_Var的方法,因爲所有方法都使用堆棧並承擔開銷,這是屬性語法要避免的目的。但是我可以理解這種做法的唯一方法是:a)編譯器只是將變量保存在調用類中,而將變量鏈接到調用類,或者編譯器獲取變量的副本並鏈接調用類到它。只有在第二種情況下,被調用的類才能被放棄進行垃圾收集。 – ste3e

1

不太清楚你的問題。如果您希望在處理XML文件後允許該實例進行垃圾回收,則可以在使用中使用XmlReader。如您所說的將屬性賦予私有變量聽起來是正確的。如果沒有實時引用,GC可以收集XmlReader實例。您可以嘗試在example以下。

using語句定義了一個範圍,在該範圍之外將放置一個或多個對象。對於像XmlReader這樣的具有文件處理程序的對象調用Dispose方法是一種很好的做法。

var myProperties; 

    using (XmlReader reader = XmlReader.Create("file1.xml")) 
    { 
     while (reader.Read()) 
     { 
       // myProperties = reader.....; 
      } 
     } 
    } 

上面的代碼,以檢查是否存在垃圾收集任何問題,因爲如果你嘗試參考using語句的XmlReaders性能出方將扔在任何情況下,異常的好方法。如果您已將值分配給私有變量,那應該很好。