在测试我的代码时,我遇到了一个我觉得很奇怪的行为。
此:
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 Test Framework编写测试时遇到过它。
答案 0 :(得分:4)
如果您需要更改参考,则需要更改签名:
public static int ReleaseIfNotNull(ref object comObject)
将comObject
内的ReleaseIfNotNull
的本地引用更改为仅影响其自身(堆栈)副本,并且不会影响对其的任何其他引用。 ref
and out