C# 在不可变对象中从终结器处理基础对象
我试图将C# 在不可变对象中从终结器处理基础对象,c#,.net,design-patterns,awesomium,C#,.net,Design Patterns,Awesomium,我试图将Awesomium包装起来,使我的代码的其余部分尽可能接近NET的WebBrowser,因为这是针对已经使用WebBrowser的现有应用程序的 在这个库中,有一个名为JSObject的类,它表示一个javascript对象。例如,您可以通过调用WebView类的ExecuteJavascriptWithResult方法来实现这一点。如果您像myWebView.ExecuteJavascriptWithResult(“document”,string.Empty).ToObject()那
Awesomium
包装起来,使我的代码的其余部分尽可能接近NET的WebBrowser
,因为这是针对已经使用WebBrowser
的现有应用程序的
在这个库中,有一个名为JSObject
的类,它表示一个javascript对象。例如,您可以通过调用WebView
类的ExecuteJavascriptWithResult
方法来实现这一点。如果您像myWebView.ExecuteJavascriptWithResult(“document”,string.Empty).ToObject()
那样调用它,那么您将得到一个表示文档的JSObject
我正在编写一个名为JSObjectWrap
的不可变类(它的唯一字段是一个readonly JSObject
对象),它围绕JSObject
进行包装,我想将它用作模拟.NET类的其他类的基类,例如HtmlElement
和HtmlDocument
。现在,这些类没有实现Dispose
,但是JSObject
实现了。我首先想到的是在我的JSObjectWrap
的终结器中调用底层的JSObject
的Dispose
方法(而不是让JSObjectWrap
实现Dispose
),以便我的其余代码可以保持原样(无需在任何地方使用添加,并确保每个JSObjectWrap
都被正确处理)
但我刚刚意识到,如果两个以上的JSObjectWrap
具有相同的底层JSObject
,其中一个被最终确定,这将搞乱另一个JSObjectWrap
。所以现在我想也许我应该保留一个JSObjects
的静态字典,并统计每个对象的数量由JSObjectWrap
引用的ing,但这听起来很混乱,我认为可能会导致严重的性能问题
由于这听起来像是一种常见的模式,我想知道是否还有其他人有更好的想法。如果超过2个JSObjectWrap具有相同的底层JSObject,则有超过2个引用引用JSObject,因此在引用计数达到0之前不会对其进行垃圾收集。我是否遗漏了什么
评论后编辑:
好的。我明白了。你想做的是能够共享JSObject,但只要有人引用它,你就不想处理它。对我来说,唯一的出路似乎是你建议的保留JSObject字典。要画一个平行图,这与.NET/JVM对只与区别在于,在我们的示例中,dispose在这里意味着对字符串进行垃圾收集,除非引用计数为零(我想这是无法确定的,除非维护字典),字符串不符合垃圾收集的条件。要跟进user1168577的回答,您当然可以设置系统,使包装器和包装器之间存在一对一的关系。然后(更喜欢组合而不是继承),让库类在适当的情况下保存对同一包装类的引用。然后垃圾收集器就可以发挥它的魔力了
但这样做可能会浪费您的时间。IDisposable实现程序的标准模式在终结器中调用Dispose(如果以前没有调用过)。使用ILSpy或类似工具对JSObject进行反编译以确认它是否执行了此操作。如果执行了,则无需编写也执行此操作的代码
如果您确信您的包装器库永远不会用于新代码,那么您甚至不需要实现IDisposable;如果需要,那么就实现接口,但允许遗留代码忽略调用Dispose,除非您出于某种原因必须对其进行修改。啊,在背面打勾时要小心。JSObjectWrap
这是垃圾吗已收集,这将导致其终结器处理JSObject
。请注意,.NET对字符串或任何其他对象类型都不使用引用计数。您是对的。它们的终结器已经调用了dispose,因此我真的不需要做任何事:)。顺便说一句,我不知道。我非常喜欢它!