C# (Xamarin,Android)此代码如何帮助减少引用的实例?

C# (Xamarin,Android)此代码如何帮助减少引用的实例?,c#,xamarin,mono,garbage-collection,xamarin.android,C#,Xamarin,Mono,Garbage Collection,Xamarin.android,我正在阅读Android的垃圾收集文档,我不太了解这段代码的机制 class HiddenReference<T> { static Dictionary<int, T> table = new Dictionary<int, T> (); static int idgen = 0; int id; public HiddenReference () { lock (table) {

我正在阅读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)));
    }
}
类隐藏引用{
静态字典表=新字典();
静态int idgen=0;
int-id;
公共隐藏引用()
{
锁(表){
id=idgen++;
}
}
~HiddenReference()
{
锁(表){
表.删除(id);
}
}
公共价值{
获取{lock(table){返回表[id];}}
设置{lock(table){table[id]=value;}}
}
}
班级活动:活动{
HiddenReference字符串=新的HiddenReference();
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
strings.Value=新列表(
可枚举范围(0,10000)
.选择(v=>newstring('x',v%1000));
}
}
HiddenReference是如何工作的?如果GC将递归地扫描BetterActivity引用的实例,它难道看不到字符串字段中的列表,然后是列表中的所有字符串吗?我想我错过了什么。感谢您的帮助


谢谢大家!

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


注意:如果在GC过程中看到速度变慢,那么应该减少
活动中的引用。如果你的应用程序运行正常,就不用麻烦优化了。

谢谢!答案很清楚。所以这个策略不仅仅是Xamarin,它可以用于其他一些.Net项目吗?和WinForm一样,WPF?这是Xamarin。仅限Android。我们必须确保javagc和monogc愉快地合作。引用漫游是这两个世界相互作用的结果。所以在一般的.Net项目中,GC不会进行递归扫描吗?为什么Mono需要进行一次引用漫游才能愉快地使用JavaGC?原谅我的无知,谢谢你~~!它与何时允许收集对象有关。只有当Java世界和托管世界都没有对它的引用时,我们才能放手。这个过程很复杂。在托管GC运行期间,我们将所有对Java对等对象的强引用替换为弱引用。然后触发本机集合。如果之后对象消失了,我们可以让托管对象消失(如果它符合收集条件)。否则,我们将重新创建强引用。为了防止收集对等点,我们必须检查所有潜在的引用,从而进行递归扫描。