4

我想这样做是为了测试我的代码。我想我可以围绕弱引用对象制作另一个包装器,但更愿意直接模拟原始对象被回收。

这是我到目前为止的代码

 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

我有一些框架逻辑可以根据弱引用的状态进行内务处理。我希望能够测试该逻辑,为此,我需要能够随意更改弱引用状态 - 那么我该怎么做呢?

4

4 回答 4

3

我想知道这是否与字符串被实习有关,因为以下测试通过了:

    var myObject = new object();
    var myObjectRef = new WeakReference(myObject);
    myObject = null;
    GC.Collect();
    Assert.IsFalse(myObjectRef.IsAlive);
于 2013-08-22T17:59:18.670 回答
2

默认情况下,文字字符串是实习生的,因此尽管您为空myString,但实例仍由实习生表植根。

有关如何处理实习的详细信息,请参阅对此问题的回答。

于 2013-08-22T18:03:37.310 回答
2

不要将字符串硬编码到源文件中,而是通过外部源将其读入。例如,您可以创建一个TestStrings.txt放置字符串的文件并使用它。

string myString = File.ReadAllText(@"TestStrings.txt");         

var myStringRef = new WeakReference(myString);
myString = null;

GC.Collect();
Assert.IsFalse(myStringRef.IsAlive);

这应该返回 false。正如另一个答案中提到的,这确实是由于字符串实习。

通过从外部源读取文本,字符串将不会被留在这里,这似乎是你想要的这个测试。(您可以使用String.IsInterned方法检查字符串是否被实习)。

于 2013-08-22T18:12:18.463 回答
0

为此,我需要能够随意更改弱引用状态

您可以构建一个抽象WeakReference并使其可测试(使用允许您更改返回的值的接口或“测试模式” IsAlive)。

于 2013-08-22T18:01:38.043 回答