(Xamarin,Android)这段代码如何帮助减少引用实例

本文关键字:实例 帮助 何帮助 引用 代码 Xamarin Android 段代码 | 更新日期: 2023-09-27 17:59:55

我正在阅读针对Android的垃圾回收文档——减少引用实例,我不太了解这个代码的机制

class HiddenReference<T> {
    static Dictionary<int, T> table = new Dictionary<int, T> ();
    static int idgen = 0;
    int id;
    public HiddenReference ()
    {
        lock (table) {
            id = idgen ++;
        }
    }
    ~HiddenReference ()
    {
        lock (table) {
            table.Remove (id);
        }
    }
    public T Value {
        get { lock (table) { return table [id]; } }
        set { lock (table) { table [id] = value; } }
    }
}
class BetterActivity : Activity {
    HiddenReference<List<string>> strings = new HiddenReference<List<string>>();
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);
        strings.Value = new List<string> (
                Enumerable.Range (0, 10000)
                .Select(v => new string ('x', v % 1000)));
    }
}

HiddenReference是如何工作的?如果GC将递归地扫描BetterActivity引用的实例,难道它看不到字符串字段中的列表,然后看不到列表中的所有字符串吗?我想我错过了什么。感谢您的帮助。

谢谢!

(Xamarin,Android)这段代码如何帮助减少引用实例

这个想法是HiddenReference有一个static Dictionary<T>。垃圾收集器将每个静态对象视为根对象。这意味着我们有一个托管的、有根的对象。在这种情况下,GC桥不需要检查潜在的引用,因为它可以确保对象永远不会被收集。

需要注意的一点是:如果在GC过程中看到速度减慢,那么应该减少Activity中的引用。如果您的应用程序运行良好,则无需进行优化。