AS DotNet集合Stack.cs源代码

public T Peek()
{
    int size = _size - 1;
    T[] array = _array;

    if ((uint)size >= (uint)array.Length)
    {
          ThrowForEmptyStack();
    }

    return array[size];
}

存在后备数组T[] array = _array;source here的本地参考拷贝

以及集合代码库中的许多类似代码.

这是什么目的?这是否与线程安全或任何其他考虑因素有关?为什么不直接使用CLASS字段_array呢?

我在谷歌上找不到任何线索,所以期待这里的一些见解.

推荐答案

the check-in comments for the change that introduced this temporary copy这与线程安全无关.

相反,它是通过删除边界判断来优化代码的:

对于值类型,影响并不是那么大,因为仍然存在一个值类型. (手动)判断边界.对于引用类型,一个边界判断可以是 保存,所以有一个胜利.

对这些更改的 comments 和反馈非常有趣;有一些关于JIT是否会优化边界判断的讨论.

Csharp相关问答推荐

我可以将Expressc操作设置为在另一个Expressc操作完成后自动发生吗?

在C# 11之前, struct 中的每个字段都必须显式分配?不能繁殖

需要更改哪些内容才能修复被覆盖的财产中的无效警告CS 8765?

如何使嵌套for-loop更高效?

图形.DrawString奇怪异常的字距调整

为什么我不能更改尚未设置的模拟对象属性的值?

从Blob存储中提取tar.gz文件并将提取结果上载到另一个Blob存储

Appsettings.json未加载.Net 8 Blaazor Web程序集

用C#从Word文档中删除重复的节控件和文本内容控件

关于扩展文件类C#的矛盾

如何将FindAll()与Nuget包Interop.UIAutomationClient一起使用

等待一个等待函数

使用C#和.NET 7.0无法访问Cookie中的数据

如何在Akka.NET中重新启动执行元时清除邮箱

岛屿和框架中的自定义控件库.Navigate-AccessViolationException

Visual Studio如何使用当前的框架?

如何在单击按钮后多次异步更新标签

正在try 将自定义字体添加到我的控制台应用程序

C#USB条形码 scanner 在第二次扫描时未写入行尾字符

S,在.NET核心控制台应用程序中,AddScope和AddSingleton有什么不同?