问题 为什么roslyn在放入数组时将对象包装在结构中?


在阅读源代码的同时阅读 Roslyn on GitHub,我注意到了很多用过的东西 ObjectPool<T> 类。它用于减少内存开销。

它在内部使用 数组 存储池化对象。 我不明白的是它为什么使用一个名为的私有结构 Element 包含单个类型的字段 T 作为数组元素,而不仅仅是使用 T

这是出于对性能的关注吗?内存开销?


2662
2017-07-29 19:25


起源



答案:


这可能是出于性能原因。看到 这篇文章由Jon Skeet撰写

总而言之,值类型数组在C#中是不变的,这意味着运行时可以避免在数组中存储项时进行兼容性检查。在文章中,Skeet先生使用了与您描述的类似的包装器结构,并显示了对阵列的写入性能的改进。


14
2017-07-29 19:45



神圣.....我没想到这一点,应该可以将数组本身声明为不变量。比这个解决方法好多了。现在我需要在我的可视化引擎中更改一些内容。 : - / - Felix K.
该死的......我不知道这个。我肯定会明天检查一些代码: - \ - Lucas Trzesniewski
我发布了一个 功能提案 在...上 罗斯林项目。这意味着使用不变数组更容易一些。 - Wazner


答案:


这可能是出于性能原因。看到 这篇文章由Jon Skeet撰写

总而言之,值类型数组在C#中是不变的,这意味着运行时可以避免在数组中存储项时进行兼容性检查。在文章中,Skeet先生使用了与您描述的类似的包装器结构,并显示了对阵列的写入性能的改进。


14
2017-07-29 19:45



神圣.....我没想到这一点,应该可以将数组本身声明为不变量。比这个解决方法好多了。现在我需要在我的可视化引擎中更改一些内容。 : - / - Felix K.
该死的......我不知道这个。我肯定会明天检查一些代码: - \ - Lucas Trzesniewski
我发布了一个 功能提案 在...上 罗斯林项目。这意味着使用不变数组更容易一些。 - Wazner