对象实例化和弱引用

时间:2015-08-14 08:39:47

标签: c# instantiation weak-references

虽然我理解C#中弱弱引用的概念,并且可以找到很多关于这个问题的材料,但是一个简单的问题让我很困惑。

让我们来看看这个简单的场景:

class MyClass {}

class MyClass2 
{
    public MyClass2()
    {
        // #1
        new MyClass();
    }
}

class Program 
{
    static void MyMethod(MyClass instance) { }        

    static void Main() 
    {   
        MyClass2 instance = new MyClass2();             

        // #2   
        MyMethod(new MyClass());

        // #3
        WeakReference<MyClass> instance2 = new WeakReference<MyClass>(new MyClass());
    }
}

我们可以说我们已经在#1,#2和#3使用 弱引用 实例化了我们的对象吗?或者只是在#3?这有什么区别?

1 个答案:

答案 0 :(得分:3)

仅在第3行,我们可以在某种程度上 1 说“对象是使用弱引用实例化的”:在第3行中,指向新创建的实例的唯一引用是弱的引用(这意味着实例可能在实例化后立即被垃圾收集)。

第1行不是弱引用,它根本不是引用。当然,如果您在此之后立即调用某些内容(例如new MyClass().ToString()),则会自动创建一个在ToString()运行时将处于活动状态的引用,但该引用将是强引用,如在执行ToString()时,实例需要保持活跃状态​​。

第2行也不是弱引用; instance MyMethod参数是一个普通的强引用,只要参数在范围内,就会使第2行创建的实例保持活动状态。

1 :一般来说,说“使用弱引用实例化X”没有多大意义。使用构造函数实例化对象。事实上之后,只有弱引用恰好引用新实例与实例化过程无关。