C#使用弱引用防止循环引用的例子
以下是一个使用弱引用防止循环引用的例子:
using System;
public class Person
{
private WeakReference<Person> _friend;
public string Name { get; set; }
public Person(string name)
{
Name = name;
}
public void SetFriend(Person friend)
{
_friend = new WeakReference<Person>(friend);
}
public void SayHello()
{
if (_friend != null && _friend.TryGetTarget(out Person friend))
{
Console.WriteLine($"{Name} says hello to {friend.Name}!");
}
else
{
Console.WriteLine($"{Name} says hello to an unknown person!");
}
}
}
class Program
{
static void Main(string[] args)
{
Person person1 = new Person("Alice");
Person person2 = new Person("Bob");
person1.SetFriend(person2);
person2.SetFriend(person1);
person1.SayHello(); // Alice says hello to Bob!
person2.SayHello(); // Bob says hello to Alice!
// Set person2 to null to break the strong reference cycle
person2 = null;
GC.Collect(); // Trigger garbage collection
person1.SayHello(); // Alice says hello to an unknown person!
}
}
上述示例中,Person 类有一个名为 _friend 的私有成员变量,用来保存对另一个 Person 对象的弱引用。在 SetFriend 方法中,我们使用 WeakReference 类来创建一个弱引用,以避免创建一个强引用。在 SayHello 方法中,我们使用 TryGetTarget 方法来尝试获取弱引用的目标对象。如果目标对象仍然存在,则输出相应的问候语。如果目标对象已被垃圾回收,则输出一个未知人的问候语。
在 Main 方法中,我们创建了两个 Person 对象,并将它们互相设置为朋友。然后,我们调用 SayHello 方法来展示它们互相问候。接着,我们将 person2 设置为 null,这会打破循环引用。最后,我们调用 GC.Collect 方法来手动触发垃圾回收,然后再次调用 SayHello 方法,可以看到现在 person1 无法获取到 person2 的引用,输出一个未知人的问候语
原文地址: https://www.cveoy.top/t/topic/iFJE 著作权归作者所有。请勿转载和采集!