在测试代码时,我遇到了一种奇怪的行为。
这个:
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