使用“ref”和/或“out”作为对象类型 - c#

我坚持使用.Net 1.1应用程序(即我暂时无法使用2.0版的泛型功能),并且我正在尝试优化代码的某些部分。由于它涉及很多需要释放的运行时可调用包装器,因此我最终创建了一个实用程序方法,该方法会循环执行,直到释放所有引用为止。该方法的签名是:

void ReleaseObject(object comObject)

释放所有comObject之后,我将调用GC.Collect和GC.WaitForPendingFinalizers(不要问-与Office interop进行交易的任何人都知道)。

并且...像往常一样,我遇到了一个极端的情况-如果在GC.Collect调用之前未将对应的托管引用分配为null,则无法正确清理。

因此,我的代码如下所示:

ReleaseObject(myComObject);
myComObject = null;
GC.Collect()
...

因为有一堆xxx = null,所以我决定将其放入util方法中,但是由于按引用传递和传递引用参数之间存在差异,因此显然我不得不将方法更改为:

void ReleaseObject(out object comObject)
{
   //do release
   comObject = null;
}

并将呼叫者编辑为:

MyComClass myComObject = xxxx;
ReleaseObject(out myComObject);

这将失败,并显示一条消息:“无法从'out MyComClass'转换为'out object'”

虽然我可以想到为什么会出现问题(即从对象到MyComClass的反向转换不是隐式的,并且不能保证该方法将执行的操作),但我想知道是否有解决方法,或者我需要保留与我的数百个空值分配。

注意:我有一堆不同的COM对象类型,这就是为什么我需要“对象”参数而不是类型安全的原因。

参考方案

为什么调用方法比仅将变量设置为null更好?它们都是单线电话,而后者则简单得多。

听起来确实很奇怪,但是您首先需要将它们设置为null。这些静态变量或实例变量的值需要在其包含对象之前被释放吗?如果变量只是局部变量,无论如何将超出范围,将其设置为null不会有任何区别(在发行版中)。

RCW是否未实现IDisposable?如果是这样,最好调用Dispose(最好通过using语句)。

(经过评论讨论。)

这些是局部变量,该方法稍后将不再引用。这意味着垃圾收集器将意识到它们不需要被视为“根”引用-因此将它们设置为null不会有任何区别。

但是,要直接回答原始问题:不,除非方法参数的类型完全相同,否则您不能通过引用传递变量,因此您在这里很不走运。 (使用泛型是可能的,但是您已经说过,您限于.NET 1.1。)

从JAVA调用方法C#.NET - java

我有一个C#.NET项目中创建的dll,我想从Java程序中调用方法。我想知道是否存在实现此目标的机会,然后遇到了JNA和JNI。我应该使用哪一个?有什么建议么?我只需要在使用C#.NET编写的类中调用方法并处理Java程序的结果即可。 参考方案 这取决于您的应用程序,但是您可以将C#DLL放在服务中,例如WCF并以这种方式将功能公开给Java代码。使用ws…

从ASP.NET 1.1转换为ASP.Net 3.5后,单选按钮停止工作 - javascript

[我在下面以FYI的形式发布我们的问题和解决方案。如果您有Microsoft或代表机构对此问题的正式声明,我会将其标记为答案。否则,我下面的帖子将作为答案]。问题:我们采用了ASP.Net 1.1程序,并将其转换为ASP.Net 3.5。该页面最初正确显示,默认情况下选中一个单选按钮,并显示一个项目列表(“列表A”)。当我们单击另一个单选按钮时,它将正确显示…

如何使用system.out.println从void方法填充Jtextarea? - java

我正在使用具有public void方法init()和System.out.println()的库。在我的实现中,我只能访问无效的方法init(),但无法将sout的输出获取到我的gui组件JTextarea。是否可以捕获它(使用InputStream或其他方式)?任何帮助表示赞赏。谢谢 参考方案 假设您无权访问该库并且可以更改它(对于GUI应用程序,我有点…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……

在ASP.NET MVC中创建数据库回调的最有效方法 - c#

我有一个ASP.NET MVC网页,该网页基本上通过日期过滤器显示MS SQL数据库中表的行。当新行插入数据库表时,我想用新行列表更新网页视图。实现此目标的最有效方法是什么?基本上,我想从我的JavaScript创建一个到数据库服务器的回调,以用新结果更新UI。假设数据库表中的行数很大。(〜1百万)谢谢,cas 参考方案 如果数据库更新非常频繁,则可以按特定…