当我传递string给一个函数时,是一个指向传递给字符串内容的指针,还是整个字符串传递给堆栈上的函数就像struct是?
有没有办法检查.NET中的垃圾收集器是否收集了一个对象?
我正在尝试编写一个API,它将挂钩传入的对象的某些事件,我需要确保我不使用对该对象的强引用.我知道怎么做,但我也想写一个单元测试来验证这一点,而且我不知道该怎么做.
我正在使用Castle Windsor Typed Factory.在我们的注册码中,它被设置为可以创建一个Transient组件:
container.AddFacility<TypedFactoryFacility>();
container.Register(Component.For<IThingFactory>().AsFactory());
container.Register(Component.For<IThing>().ImplementedBy<TransientObject>().Named("TransientObject").LifeStyle.Transient);
Run Code Online (Sandbox Code Playgroud)
根据我对Castle Windsor Typed Factory文档的理解,我认为必须通过Typed Factory方法释放Transient对象,否则Typed Factory将保留对该对象的引用.我尝试通过编写使用此StackOverflow文章中解释的方法的测试来证明这一点.
但令我惊讶的是它实际上并没有失败,这意味着虽然我没有将瞬态物体释放回工厂,但它仍然可以被GC收回.我担心也许我的测试会产生误导,而且确实存在泄漏.
所以我的问题是:我的测试是错误的,还是文档错了?
这是测试:
var factory = container.Resolve<IThingFactory>();
WeakReference reference = null;
new Action(() =>
{
var service = factory.GetTransientObject();
reference = new WeakReference(service, true);
})();
GC.Collect();
GC.WaitForPendingFinalizers();
Assert.That(reference.Target, Is.Null, "reference should be null");
Run Code Online (Sandbox Code Playgroud) 使用Castle Windsor,我有一个配置了瞬态生活方式的组件:
<component id="publish.mapping.default"
service="IMyService, MyAssembly"
type="MyServiceImplementation, Myassembly"
lifestyle="transient" />
Run Code Online (Sandbox Code Playgroud)
将使用这样的:
var service = container.Resolve<IMyService>(componentId);
// service usage ....
// service goes out of scope ...
Run Code Online (Sandbox Code Playgroud)
我的问题是,服务实例是否会在超出范围后进行垃圾收集,或者Castle Windsor会保留引用吗?我发现了这个类似的问题,这意味着后者可能就是这种情况 - 但是在检查了那里发布的链接之后,我不确定讨论是关于保持引用,还是确保在实现IDisposable时对象被处理掉.我的物品不需要处理.
如果Castle Windsor坚持实例,是否有任何简单的方法来阻止这种情况(可能是通过配置)?
编辑
看来,我需要设置发布跟踪策略.可以在xml配置文件中配置,还是需要在代码中设置?是否可以按组件设置版本跟踪策略?