虽然我理解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?这有什么区别?
答案 0 :(得分:3)
仅在第3行,我们可以在某种程度上 1 说“对象是使用弱引用实例化的”:在第3行中,指向新创建的实例的唯一引用是弱的引用(这意味着实例可能在实例化后立即被垃圾收集)。
第1行不是弱引用,它根本不是引用。当然,如果您在此之后立即调用某些内容(例如new MyClass().ToString()
),则会自动创建一个在ToString()
运行时将处于活动状态的引用,但该引用将是强引用,如在执行ToString()
时,实例需要保持活跃状态。
第2行也不是弱引用; instance
MyMethod
参数是一个普通的强引用,只要参数在范围内,就会使第2行创建的实例保持活动状态。
1 :一般来说,说“使用弱引用实例化X”没有多大意义。使用构造函数实例化对象。事实上之后,只有弱引用恰好引用新实例与实例化过程无关。