请注意:这是关于
假设我有以下类(为了说明问题进行了夸张):
任何关于如何避免此问题的想法和建议都将不胜感激。
fscheck
的问题,而不是关于C#中IDisposable
的一般使用方法。假设我有以下类(为了说明问题进行了夸张):
public class MyDataTypeWrapper : IDisposable
{
private MyDataType fMyDataType; // MyDataType implements IDisposable
public MyDataTypeWrapper(int[] randomData)
{
// some conversion routine (not shown)
var inputToMyDataType = ConvertRandomDataToMyDataInputs(randomData);
// this could all be done in one method but breaking out into two to illustrate.
fMyDataType = new MyDataType(inputToMyDataType);
}
public void Dispose()
{
fMyDataType.Dispose();
}
}
MyDataType
消耗了一些非托管资源,因此它实现了IDisposable
接口。 MyDataType
类实际上没有一个接受int[]
的构造函数,因此使用了包装类。
创建这个的生成器相对简单,但我无法看到任何方法让这样的生成器在每次测试迭代后也负责处理已创建的对象的释放,这意味着我的测试代码经常充斥着显式调用Dispose
的语句。请参见下面的概述示例。
var generator = from randomData in Arb.Generate<int[]>()
select new MyDataTypeWrapper(randomData);
// use the generator as input to some fscheck property based tests
Prop.ForAll(generator.ToArbitrary(), (MyDataTypeWrapper randomClassUnderTest) =>
{
// want to avoid this
using(randomClassUnderTest)
{
// assert some properties
...
}
}).QuickCheckThrowOnFailure();
Prop.ForAll(generator.ToArbitrary(), (MyDataTypeWrapper randomClassUnderTest) =>
{
// assert some properties
...
// also want to avoid this (equivilant to use of using in example above)
randomClassUnderTest.Dispose();
}).QuickCheckThrowOnFailure();
任何关于如何避免此问题的想法和建议都将不胜感激。
using
块? - Ehsan SajjadProp.ForAllDisposable
,它会显式地处理传递给它的每个元素。这在一般情况下显然是不安全的,因此扩展/遮蔽Prop.ForAll
以处理所有可处理对象是可能的,但不建议这样做。您还可以编写一个IEnumerable
包装器,在每次调用Enumerator.MoveNext
时处理其包装的枚举的前一个元素,这更为通用(同样也不应随意执行)。 - Jeroen Mostertusing
语句或直接调用Dispose
。如果可能的话,我希望在fscheck
框架中找到一个解决方案。 - cristobalito