将分配哪一代静态只读成员

Mic*_*ael 1 .net c#

有这个代码

class Program
    {
        private static readonly int[] s_numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

        static void Main(string[] args)
        {
            foreach (int number in s_numbers)
            {
                WriteLine(number);
            }

            WriteLine("Press ENTER to close the app.");
            ReadLine();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想知道哪个s_numbers数组将被分配(哪一代)?我的理由如下 - 因为这是static readonly成员,它不会是nulled,所以它不会GC'd是终生的AppDomain.因此,将它直接放入GEN2是有意义的(就像使用大型物体一样)并且不在GEN0中分配它然后将它从GEN0移动到GEN2.不幸的是,我无法确认是否是这种情况(我无法使用WinDbg找到此数组).

那么重申一个问题 - 该static readonly成员将分配哪一代GC ?

Mar*_*ell 5

readonly是骗人的.您考虑readonly的主要是指导原则,而不是实际规则 - 至少在大多数运行时:

private static void ThisWorksFine()
{
    typeof(Program).GetField("s_numbers", BindingFlags.NonPublic | BindingFlags.Static)
        .SetValue(null, null);
}
Run Code Online (Sandbox Code Playgroud)

目前没有优化来检查"分配给只读静态字段"方案并在GEN2中分配该数组.可以吗?也许.对于数量非常有限的分配/对象,我打赌它不值得复杂.它今天不存在,因此它遵循通常的分配/促销规则.