有这个代码
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 ?
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中分配该数组.可以吗?也许.对于数量非常有限的分配/对象,我打赌它不值得复杂.它今天不存在,因此它遵循通常的分配/促销规则.
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |