首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的C#弱引用行为

奇怪的C#弱引用行为
EN

Stack Overflow用户
提问于 2012-11-16 19:19:50
回答 1查看 246关注 0票数 3

我花了一些时间学习弱引用在C#中是如何工作的,我遇到了这种奇怪的行为。

在下面的示例代码中,第一个测试通过,第二个测试失败。似乎你不能在构造之后但在创建对象的弱引用之前修改它的实例,而不能停止弱引用以预期的方式工作。

代码语言:javascript
复制
private class Simple
{
    public Simple() { X = "Hello"; }
    public string X { get; set; }
}

[Test]
public void CreatingWeakReferenceBeforeModifying()
{
    var a = new Simple();
    var aRef = new WeakReference(a);
    a.X = "World";  // First modification to a after creating reference
    a = null;
    GC.Collect();
    Assert.That(aRef.IsAlive, Is.False);  // This assertion passes
}

[Test]
public void CreatingWeakReferenceAfterModifying()
{
    var b = new Simple {X = "World"};  // First mod to b before creating ref
    var bRef = new WeakReference(b);
    b = null;
    GC.Collect();
    Assert.That(bRef.IsAlive, Is.False);  // This assertion fails
}

我是不是漏掉了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-16 19:25:28

我怀疑您只有在某些情况下才会看到这种情况-在调试版本下尤其可能,特别是在调试器下。

这句话:

代码语言:javascript
复制
var b = new Simple {X = "World"};

是有效的:

代码语言:javascript
复制
var tmp = new Simple();
tmp.X = "World";
var b = tmp;

因此,即使您将b设置为null,堆栈上仍有一个局部变量具有对该对象的引用。

当在优化的场景中运行时,我希望GC注意到局部变量将永远不会被再次读取,并将其作为GC根忽略-但您运行它的方式可能不会让GC变得那么激进。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13415557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档