我想这样做是为了测试我的代码。我想我可以在weakreference对象周围创建另一个包装器,但是更愿意直接模拟原始对象被回收。
这是我到目前为止的代码
var myString = "someString";
var myStringRef = new WeakReference(myString);
myString = null;
GC.Collect();
Assert.IsFalse(myStringRef.IsAlive) //I want this to pass, but it failed. IsAlive is still true.
如何强制上面的最后一行不失败(即!IsAlive
)
我有一些框架逻辑,根据弱引用的状态进行内务管理。我希望能够测试那个逻辑,为此,我需要能够随意改变弱引用状态 - 那么我该怎么做呢?
答案 0 :(得分:3)
我想知道这是否因为以下测试通过而导致字符串被中断这一事实应该得到应有的结果:
var myObject = new object();
var myObjectRef = new WeakReference(myObject);
myObject = null;
GC.Collect();
Assert.IsFalse(myObjectRef.IsAlive);
答案 1 :(得分:2)
默认情况下,文字字符串是固定的,因此尽管您实例为空myString
,但实例仍然以实习生表为根。
有关如何处理实习的详细信息,请参阅此问题的my answer。
答案 2 :(得分:1)
不是将字符串硬编码到源文件中,而是通过外部源读取它。例如,您可以创建一个TestStrings.txt
文件,其中放置了您的字符串并使用它。
string myString = File.ReadAllText(@"TestStrings.txt");
var myStringRef = new WeakReference(myString);
myString = null;
GC.Collect();
Assert.IsFalse(myStringRef.IsAlive);
这应该返回false。正如在另一个答案中所提到的,这确实是由于字符串实习。
通过从外部源读取文本,字符串将不会在此处实现,这似乎是您对此测试所需的内容。 (您可以使用String.IsInterned方法检查字符串是否被中断。)
答案 3 :(得分:0)
这样做,我需要能够随时改变弱引用状态
您可以围绕WeakReference
构建抽象并使其可测试(使用允许您更改IsAlive
返回的值的接口或“测试模式”)。