gpt4 book ai didi

c# - 静态只读成员分配在哪一代

转载 作者:太空宇宙 更新时间:2023-11-03 18:22:24 25 4
gpt4 key购买 nike

有这个代码

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();
}
}

我想知道 s_numbers 数组将被分配到哪里(哪一代)?我的推理如下 - 因为这是 static readonly 成员,它不会被 nulled,所以它不会是 GC'd AppDomain 的生命周期。因此,直接将其放入 GEN2 是有意义的(就像处理大型对象一样)而不是将其分配到 GEN0 中,然后将其从 GEN0 向上移动到 GEN2。不幸的是,我无法确认情况是否如此(我无法使用 WinDbg 找到此数组)。

所以重申这个问题 - 这个 static readonly 成员将被分配到哪个 GC 代?

最佳答案

readonly 是个谎言。您认为 readonly 很大程度上只是一个指南,而不是实际规则 - 至少在大多数运行时:

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

目前不存在检查此“分配给只读静态字段”场景和分配 GEN2 中数组的优化。可以吗?或许。我敢打赌,对于数量非常有限的分配/对象来说,不值得这么复杂。它今天不存在,所以它遵循通常的分配/提升规则。

关于c# - 静态只读成员分配在哪一代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47927843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com