首页 > 解决方案 > 如果可以在同一位置有两个字段,c# 中的 FieldOffsetAttribute 如何与垃圾收集器兼容?

问题描述

在 C# 中,您可以这样做:

[StructLayout(LayoutKind.Explicit)]
public class Stuff
{
    public int blah1 = 3;
    public String blah2 = "sadfsadf";
    public bool blah3 = true;
    public ulong blah4 = 23423423420569032;
    public Stuff next;
}

[StructLayout(LayoutKind.Explicit)]
public struct SYSTEM_INFO
{
    [FieldOffset(0)] public String Blah1;
    [FieldOffset(0)] public int[] Blah2;
    [FieldOffset(0)] public Stuff Blah3;
}

我不明白垃圾收集如何在托管堆中移动对象并更改指针所指的位置时能够做到这一点,而不会从根本上改变它的行为以及它如何能够遍历堆栈。

如果垃圾收集器移动位于 in 的字符串Blah1,in 将尝试更改 at 的引用Blah1,这将间接更改Blah2and的引用Blah3。这是否意味着垃圾收集器将自动在Blah2and处收集引用的对象Blah3,如果它们仅在此SYSTEM_INFO结构中被引用?

垃圾收集器如何知道该Blah3字段是否是一个有效的 Stuff,应该通过它来了解下一个字段是否需要标记为已使用,或者该Blah3字段是否只是指向字符串的开头(使用 from Blah1)?

标签: c#structgarbage-collectionunionsunsafe

解决方案


推荐阅读