2012-07-04 20 views
1

我試圖環繞Awesomium,並使其代碼的其餘部分儘可能接近NET的WebBrowser,因爲這適用於已使用WebBrowser的現有應用程序。將終結器中的底層對象置於不可變對象中

在這種庫中,有一個稱爲JSObject表示javascript對象類。例如,您可以通過調用WebView類的ExecuteJavascriptWithResult方法獲得其中的一個。如果你把它叫做myWebView.ExecuteJavascriptWithResult("document", string.Empty).ToObject(),那麼你會得到代表文檔的JSObject

我正在寫一個不可變類(它的唯一領域是readonly JSObject對象)稱爲JSObjectWrap是環繞JSObject,我想作爲該會效仿.NET類如HtmlElementHtmlDocument其他類的基類使用。現在,這些類不執行Dispose,但JSObject呢。我首先想到的是在我的JSObjectWrap的終結器(而不是JSObjectWrap實現Dispose)中調用底層的JSObjectDispose方法,以便我的代碼的其餘部分可以保持原樣(而不必添加using's無處不在,並確保每個JSObjectWrap正在妥善處置)。

但是我剛纔意識到如果兩個以上的JSObjectWrap有相同的底層JSObject並且其中一個被敲定,這會弄亂其他JSObjectWrap。所以,現在我想也許我應該保持JSObjects靜態Dictionary並保持多少他們每個人都被一個JSObjectWrap引用計數,但這聽起來很凌亂,我認爲可能會導致重大的性能問題。

由於這聽起來好像是一個常見的模式我不知道其他人有更好的主意。

+1

哎,去容易在背打勾。 –

回答

1

要跟進user1168577的答案,你當然可以設置系統了所以有包裝和wrappees之間的一對一的關係。然後(比起繼承更喜歡構圖),在適當的時候讓庫類擁有對相同包裝類的引用。然後垃圾收集器可以發揮它的魔力。

但這樣做可能會浪費你的時間。 IDisposable實現者的標準模式在終結器中調用Dispose(如果它之前未被調用過)。使用ILSpy或類似工具反編譯JSObject以確認它執行此操作。如果是這樣,那麼你就沒有必要寫代碼這樣做!

如果您確定您的包裝庫將永遠不會被用於新的代碼,那麼你甚至都不需要實現IDisposable;如果它會,然後實現接口,但允許遺留代碼省略調用Dispose,除非您必須修改它的原因。

+0

你說得對。他們的終結者已經調用Dispose,所以我真的不需要做任何事情:)。 BTW不知道ILSpy。我很害怕它! – Juan

1

如果超過2 JSObjectWrap具有相同的基本JSObject,有超過2個引用引用JSObject,所以它不會被垃圾收集,直到引用計數爲0。我失去了什麼?

編輯之後評論:

好的。我知道了。你想要做的就是能夠共享JSObject,但只要有人引用它就不想丟棄它。對我來說,唯一的出路似乎就是你通過保存JSObjects字典的建議。爲了繪製一個並行,這與.NET/JVM爲不可變字符串所做的工作非常相似,唯一的區別在於,我們的示例中的配置意味着此處的字符串的垃圾回收,除非引用計數爲零(即I除非保持字典,否則猜測不能確定),則String不符合垃圾回收的條件。

+0

JSObjectWrap是否會被垃圾收集,這會導致終結器處理'JSObject'。 – Juan

+0

請注意,.NET不使用引用計數,字符串或任何其他對象類型。 – phoog

相關問題