gpt4 book ai didi

.net - 拳击会在 .NET 中产生垃圾吗?

转载 作者:行者123 更新时间:2023-12-04 13:55:37 24 4
gpt4 key购买 nike

我想知道在对象中装箱值类型是否是一种特殊情况,或者.NET 构造的“框”在删除对它的任何引用后是否会变成垃圾(GC 必须收集)。

例如, StringBuilder.AppendFormat() 有这些重载:

StringBuilder.AppendFormat(string format, object arg0);
StringBuilder.AppendFormat(string format, object arg0, object arg1);
StringBuilder.AppendFormat(string format, object arg0, object arg1, object arg2);
StringBuilder.AppendFormat(string format, params object[] args);

为具有 3 个或更少参数的调用提供这些额外的重载可能表明装箱确实是一种特殊情况(或者从性能的角度来看,它可以避免数组构造)。

从理论上讲,使用普通的旧引用计数,可能使用可重用框池将是一个有效的实现,因为不能有从一个框到另一个框的引用,只有从 .NET 对象到一个框。

最佳答案

首先,澄清一下:创建对象引用数组不是装箱。 “拳击”是一个在 .NET 中具有非常特殊含义的术语,我认为值得坚持下去。

装箱确实会产生垃圾 - 或者更确切地说,每次装箱时,它都会创建一个可能最终成为垃圾的新对象。 (它不必变成垃圾——在应用程序的剩余生命周期中,您可能会引用该对象;这非常罕见。)

但是,您可以有一个用于装箱目的的缓存。事实上,Java 确实适用于少量数字。如果你写:

Integer x = 5;
Integer y = 5;
System.out.println(x == y); // Reference comparison

那么保证打印 true .

但是,这只是一组固定类型的小缓存 - 它不是通用缓存。您需要平衡使用弱引用(不是引用计数 - .NET 中的 GC 机制只是没有引用计数,而且您不能真正仅针对装箱值引入)的痛苦,这几乎肯定会损害性能不仅仅是拳击制造垃圾的小成本。

.NET 可以采用与 Java 相同的方法并将某些类型的某些值装箱,但我不确定是否值得额外的概念包袱——尤其是当平台支持自定义值类型(Java 不支持)时。

可能值得注意的是,从 .NET 2.0 开始,拳击比以前少了一些。它在数据绑定(bind)和反射中发生了相当多的情况,但现在在普通的旧数据操作中不太常见。

关于.net - 拳击会在 .NET 中产生垃圾吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2227334/

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