【发布时间】:2010-09-19 16:17:00
【问题描述】:
我坚持使用 .Net 1.1 应用程序(即我现在不能使用 2.0 中的泛型好东西),并且我正在尝试优化代码的某些部分。由于它处理了很多需要释放的运行时可调用包装器,因此我最终创建了一个实用方法,该方法循环直到所有引用都被释放。该方法的签名是:
void ReleaseObject(object comObject)
释放所有 comObjects 后,我调用 GC.Collect 和 GC.WaitForPendingFinalizers(不要问 - 任何处理 Office 互操作的人都知道)。
而且...像往常一样,我遇到了一个极端情况 - 如果我没有在 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'”
虽然我能想到为什么会出现问题(即从 object 到 MyComClass 的反向转换不是隐式的,并且无法保证该方法会做什么),但我想知道是否有解决方法,或者我需要保留我的数百个空值分配。
注意:我有一堆不同的 COM 对象类型,这就是为什么我需要一个“对象”参数,而不是一个类型安全的参数。
【问题讨论】: