当前位置: 首页 > news >正文

C#容器源码分析 --- Stack<T>

在 C# 中,Stack<T> 是一个泛型集合类,它位于 System.Collections.Generic 命名空间下,实现了后进先出(LIFO,Last-In-First-Out)的数据结构, 其核心实现基于动态数组。

.Net4.8 Stack<T>源码地址:
stack.cs (microsoft.com)https://referencesource.microsoft.com/#System/compmod/system/collections/generic/stack.cs,c5371bef044c6ab6

内部结构:

1.主要字段属性:

类似于List<T>中的内部数据结构:
_array:这是一个泛型数组,用于实际存储 Stack<T> 中的元素。Stack 里的元素都存放在这个数组中。
_size:表示当前 Stack<T> 中实际存储的元素数量,反映了栈中有效元素的个数。
_version:用于记录 Stack<T> 的版本号。每当对栈进行添加、删除等修改操作时,这个版本号会增加。它主要用于在迭代栈时检测栈是否被修改,如果被修改则会抛出异常,以保证迭代的安全性。
_defaultCapacity:这是一个常量,代表 Stack<T> 的默认初始容量,值为 4。当创建一个 Stack<T> 对象且未指定初始容量时,会使用这个默认值。
_emptyArray:这是一个静态只读的空数组,用于在某些情况下表示空栈。
Count:返回_size,当前存储的元素数量。

2.构造方法:

类似于List<T>的构造函数:
1.无参构造函数

2.指定初始容量的构造函数

3.从现有集合初始化的构造函数

动态扩容机制:

类似于List的动态扩容机制,默认在达到数组最大长度时,将数组长度扩大两倍。

主要方法:

1.Peek:

2.Pop:

3.Push:

4.TrimExcess:

5.Contains:

解释:使用EqualityComparer<T>.Default判断是否于目标是否一致
 EqualityComparer<T>.Default 是一个静态属性,用于获取类型 T 的默认相等比较器。它会根据类型 T 是否实现 IEquatable<T> 接口,自动选择最合适的比较逻辑。
规则
1.若 T 实现了 IEquatable<T>,则使用其 Equals 方法。
2.若 T 未实现 IEquatable<T>,则回退到 object.Equals(值类型按值比较,引用类型按引用比较)。
3.自动处理 T 为可空类型(如 int?)的情况。

 EqualityComparer<T>中的CreateComparer方法源码看出,在执行此方法时会按照T的类型返回一个比较器赋值给EqualityComparer<T>.Default,比较器内部都实现了Equals方法,若T内部实现了Equals方法就使用T内部的。

注:
typeof(IEquatable<T>)​​:获取 IEquatable<T> 接口的 Type 对象。
​​.IsAssignableFrom(t)​​:判断类型 t 的实例是否可以赋值给 IEquatable<T> 类型的变量,即 t 是否实现了该接口。 


文章转载自:

http://ld5I7Ko3.yhrfg.cn
http://Va2n1cmI.yhrfg.cn
http://D1KPoDOS.yhrfg.cn
http://952tRFJJ.yhrfg.cn
http://meFBdC8S.yhrfg.cn
http://M6AO3657.yhrfg.cn
http://tauWkAZ7.yhrfg.cn
http://ocp6e53L.yhrfg.cn
http://W0CZFzGj.yhrfg.cn
http://vc6iNp2Z.yhrfg.cn
http://yfbWuaFs.yhrfg.cn
http://X9kl9IyV.yhrfg.cn
http://TutTtSvG.yhrfg.cn
http://YTQkG1Nt.yhrfg.cn
http://Od4Q7P2c.yhrfg.cn
http://VJBx0eRt.yhrfg.cn
http://eN4wcBxz.yhrfg.cn
http://YN5I2XRo.yhrfg.cn
http://ag6VLtmo.yhrfg.cn
http://aTO8bRnF.yhrfg.cn
http://yShZ0ul4.yhrfg.cn
http://bSL58ZjN.yhrfg.cn
http://QrRPljPH.yhrfg.cn
http://RFyeFFUG.yhrfg.cn
http://RqWn3ax4.yhrfg.cn
http://Qp7KdC4F.yhrfg.cn
http://gpILBifE.yhrfg.cn
http://VvwMeHeb.yhrfg.cn
http://PUkfdN5N.yhrfg.cn
http://pNvQutCR.yhrfg.cn
http://www.dtcms.com/a/128503.html

相关文章:

  • 蓝桥杯真题——好数、R格式
  • Linux-内核驱动-led
  • C# --- IEnumerable 和 IEnumerator
  • app逆向专题三:adb工具的使用
  • python格式化字符串漏洞
  • 想写回忆录了讲讲我的故事
  • 《汽车制造技术基础》第一次作业
  • FileOutputStream 详解与记忆方法
  • 第十六届蓝桥杯省赛JavaB组题解
  • Ansible-Playbook详解
  • 第十六届蓝桥杯大赛软件赛省赛 C/C++ 大学B组
  • 【图像处理基石】什么是抗锯齿(Anti-Aliasing)?
  • 上海AI实验室开源Intern VL3系列模型:整体文本性能优于 Qwen2.5 系列
  • maven编译jar踩坑[sqlite.db]
  • [福游宝——AI智能旅游信息查询平台]全栈AI项目-阶段一:Vite前端开荒
  • 【模块化拆解与多视角信息1】基础信息:隐藏的筛选规则——那些简历上没说出口的暗号
  • 使用 Visual Studio 2022 (VS2022) 编译 FreeCAD 1.0.0 的详细教程
  • Model Context Protocol (MCP) - 尝试创建和测试一下MCP Server
  • 探秘Transformer系列之(26)--- KV Cache优化 之 PD分离or合并
  • swift菜鸟教程29-30(泛型,访问控制)
  • 文件上传基本原理靶场实现
  • SpringBoot(一)
  • 融合动态权重与抗刷机制的网文评分系统——基于优书网、IMDB与Reddit的混合算法实践
  • 【源码】SpringBoot源码分析
  • 301.找出3位偶数
  • [ctfshow web入门] web37
  • 【软考系统架构设计师】系统配置与性能评价
  • 使用Python建模量子隧穿
  • String类基本使用
  • SQL基础入门:从CRUD到JOIN再到索引(通俗易懂版)