在测试代​​码时,我遇到了一种奇怪的行为。

这个:

if (_sampGrabber != null)
{
    Marshal.ReleaseComObject(_sampGrabber);
    _sampGrabber = null;
}


产生_sampGrabber == null,而之后

ReleaseIfNotNull(_sampGrabber);


_sampGrabber在使用时仍具有原始值

public static int ReleaseIfNotNull(object comObject)
{
    int hr = 0;

    if (comObject != null)
    {
        hr = Marshal.ReleaseComObject(comObject);
        comObject = null;
    }
    return hr;
}


_sampGrabber是DirectShow SampleGrabber筛选器接口。

我对这种行为的解释很感兴趣。使用Visual Studio测试框架编写测试时,我碰到了它。

最佳答案

如果需要更改引用,则需要更改签名,如下所示:

public static int ReleaseIfNotNull(ref object comObject)


comObject中将本地引用更改为ReleaseIfNotNull只会影响其自己的(堆栈)副本,而不会影响对其的任何其他引用。 ref and out上的MSDN

10-06 10:34