以下是一个使用弱引用防止循环引用的例子:

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 的引用,输出一个未知人的问候语

C#使用弱引用防止循环引用的例子

原文地址: https://www.cveoy.top/t/topic/iFJE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录