2

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

这个:

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 测试框架编写测试时遇到了它。

4

1 回答 1

4

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

public static int ReleaseIfNotNull(ref object comObject)

更改对comObjectinside的本地引用ReleaseIfNotNull只会影响它自己的(堆栈)副本,不会影响对它的任何其他引用。MSDN 上refout

于 2013-06-11T09:59:10.870 回答