![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C#
文章平均质量分 82
漫漫无期
这个作者很懒,什么都没留下…
展开
-
NET探秘:MSIL权威指南 简单示例
MSIL权威指南 简单示例原创 2021-12-18 16:40:08 · 996 阅读 · 0 评论 -
C#常用集合的实现原理(HashSet)
C# HashSet实现原理概述原创 2021-12-25 16:16:44 · 1152 阅读 · 0 评论 -
C#常用集合的实现原理(SortedList)
SortedList集合类是有序线性表,本质上是一颗二叉查找树。原创 2022-01-08 14:16:02 · 786 阅读 · 0 评论 -
C#常用集合的实现原理(List)
List 集合类是顺序线性表,Add操作是O(1)或是O(n)的,由于List的容量是动态扩容的,在未扩容之前,其Add操作是O(1),而在需要扩容的时候,会拷贝已存在的那些元素同时添加新的元素,此时的Add操作是O(n)的。而对于Contains方法,其是按照线性检索的,其复杂度是O(n)。而BinarySearch方法,其是按二分查找的,其复杂度是O(lg n)。SortedList集合类是有序线性表,Add操作是O(n), 其Contains方法是通过二分查找检索元素的,因此复杂度是O(lg n)原创 2021-10-13 21:30:02 · 2462 阅读 · 0 评论 -
C#循环遍历同时执行删除操作
使用foreach List<int> arr = new List<int>() {1, 2, 4, 5}; foreach (var num in arr) { if (num == 2) { arr.Remove(num); } }这种做法会抛出异常:InvalidOperationExcepti原创 2021-10-10 13:43:15 · 5085 阅读 · 2 评论 -
C# foreach的实现原理
为什么数组和集合可以使用foreach遍历因为数组和集合都实现了IEnumerable接口,该接口中只有一个方法,GetEnumerator()。数组类型是从抽象基类型Array派生的引用类型。由于此类型实现了IEnumerable,因此可以对C#中的所有数组使用foreach迭代。IEnumerable和IEnumerator接口定义 // 摘要: // 公开枚举器,该枚举器支持在非泛型集合上进行简单迭代。 public interfac...原创 2021-08-31 22:05:06 · 635 阅读 · 0 评论 -
C# 深入理解委托、匿名方法和 Lambda 表达式
https://zhuanlan.zhihu.com/p/101178999转载 2021-08-22 15:08:51 · 491 阅读 · 0 评论 -
C# in,out,ref关键字及协变逆变
ref修饰符,指定参数由引用传递,可以由调用方法读取或写入。 out修饰符,指定参数由引用传递,必须由调用方法写入。 in修饰符,指定参数由引用传递,可以由调用方法读取,但不可以写入。in关键字in修饰符通过引用传递参数。 它让形参成为实参的别名,即对形参执行的任何操作都是对实参执行的。它类似于ref或out关键字,不同之处在于in参数无法通过调用的方法进行修改。struct Product{ public int ProductId { get; set; ...原创 2021-08-07 08:28:21 · 1650 阅读 · 0 评论 -
C#垃圾回收机制GC
C#技术漫谈之垃圾回收机制(GC)转载 2021-07-17 09:20:21 · 1420 阅读 · 0 评论 -
Effect C# 学习笔记 杂项(持续更新)
条目45 尽量减少装箱和拆箱.NET Framework用装箱和拆箱在值类型和引用类型之间架起了桥梁。装箱将把一个值类型放在一个未确定类型的引用对象中,让这个值类型也能在需要引用类型的地方使用,而拆箱则是指从箱中获取出其中值类型的副本。装箱和拆箱都是较为影响性能的操作,有时还会创建对象的临时副本,进而导致一些难以发现的Bug。你应尽量地避免装箱和拆箱操作。状态会把值类型转换为引用类型。这个新的引用类型(即箱子)将分配于堆上,该值类型的一个副本会存放在引用类型的内部。箱子包含了值类原创 2021-07-10 08:32:38 · 124 阅读 · 2 评论 -
C#常用集合的实现原理(Dictionary)
源码剖析Entry结构体 private struct Entry { public int hashCode; // Lower 31 bits of hash code, -1 if unused public int next; // Index of next entry, -1 if last public TKey key; // Key of entry原创 2021-06-19 09:44:10 · 486 阅读 · 0 评论 -
Effect C# 学习笔记 使用框架
条目30 使用覆写而不是事件处理函数很多.NET类提供了两种不同的方式,都可以处理系统中触发的事件——要么使用事件处理函数,要么覆写基类中的虚方法。在派生类中,你只应该覆写虚方法。而事件处理函数则应该仅用在那些不想关对象的交互中。若是事件处理函数中抛出了异常,那么事件处理函数链上的后续处理函数则无法得到调用。其他一些错误组织的代码也会阻止系统调用到你的事件处理函数。而若是覆写这个受保护的虚方法,那么处理函数将首先被调用。你无法保证所有的事件处理函数都会被调用,因为有些错误组织的处理函数中可能会抛出异原创 2021-05-22 09:28:02 · 242 阅读 · 0 评论 -
Effect C# 学习笔记 使用C#表达式设计
条目21 限制类型的可见性在保证类型可以完成其工作的前提下,你应该尽可能地给类型分配最小的可见性。也就是,仅暴露那些需要暴露的。尽量使用较低可见性的类来实现公有接口。可见性越低,能访问你能的代码越少,以后可能出现的修改也就越少。此外,更少的公有类型也会让单元测试变得更加简单。若减少了共有类型的数量,也就意味着需要为公有方法创建的单元测试数量也会减少。不仅如此,若是有更多的公有API通过接口暴露,那么单元测试过程中也更容易使用使用替代类型。条目22 通过定义并实现接口替代继承...原创 2021-05-15 09:32:15 · 286 阅读 · 0 评论 -
Effect C# 学习笔记 .Net资源管理
.Net内存管理机制GC(垃圾收集器)将替你控制托管内存。与原生环境不同,在.Net中不用担心内存泄漏、悬挂指针、未初始化指针等问题。不过GC并不是万能的,对于非托管的资源清理,如文件句柄、数据库连接、GDI+对象、COM对象以及其他系统对象等。此外,若是使用了事件处理函数和委托在对象间建立了连接,那么还可能造成对象超过预期地长时间驻留在内存中。那些将在请求结果时才会真正执行地查询有时也会导致同样的问题。因为查询将把需要绑定的局部变量用闭包封装起来,而这些绑定的变量只有在查询结果离开作用域之后才会被释放原创 2021-05-02 08:46:01 · 309 阅读 · 0 评论 -
Effect C# 学习笔记 C#语言习惯
条目1 使用属性而不是可访问的数据成员属性(property)一直是C#语言中比较有特点的存在。允许将数据成员作为共有接口的一部分暴露出去,同时仍旧提供面向对象环境下所需的封装。属性这个语言元素可以让你像访问数据成员一样使用,但其底层依旧是使用方法实现的。使用属性,可以非常轻松的在get和set代码段中加入检查机制。需要注意,正因为属性是用方法实现的,所以它拥有方法所拥有的一切语言特性:1)属性增加多线程的支持是非常方便的。你可以加强 get 和 set 访问器(accessors)的实现来原创 2021-05-01 09:13:34 · 227 阅读 · 0 评论