Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.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#_.net_Design Patterns_Awesomium - Fatal编程技术网

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,因此我真的不需要做任何事:)。顺便说一句,我不知道。我非常喜欢它!