c#四部曲(进阶)

本文深入探讨C#的高级特性,包括哈希表、泛型、链表、委托、事件、Lambda表达式、反射、线程、预处理器指令、自定义特性、迭代器和特殊语法。讲解了各种数据结构的操作,如ArrayList、字典和链表的添加、删除及遍历。还介绍了线程管理和反射获取类信息的方法,以及泛型约束、委托多播、匿名函数和Lambda表达式的使用。文章进一步讨论了C#中的排序算法,如插入排序、希尔排序、归并排序、快速排序和堆排序。最后,文章提到了可空类型、值类型与引用类型的区别,以及迭代器和特殊语法的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

目录

练习题:ArrayList

哈希表

遍历

​编辑没办法用for循环去遍历

 Keys  Values

泛型

泛型约束 关键字 where T:

练习题​编辑

字典 DIctionary

链表

Add方法

Remove方法

遍历  

总结​编辑

​编辑双向链表 

数据集合复习

委托​编辑

多播委托

Action 无参无返回值   Action<> 多参无返回值   Func<> 多参有返回值  

​编辑练习题

Event事件 

匿名函数​编辑

练习题

lambad表达式

闭包

List排序​编辑

接口法

委托法

练习题:

协变逆变

Thread线程

​编辑

​编辑start()

后台IsBackground

结束

Sleep(毫秒)

Lock(){}

预处理器

#define

# if

反射

获取反射

获取反射中的信息

MemberInfo 成员

​编辑

ConstructorInfo 构造函数

FieldInfo 变量

MethodInfo  方法

Activator

Assembly

特性

自定义特性class :Attribute

IsDefined

GetCustomAttributes(继承链)

限制

系统自带特性

Obsolete

调用者信息

[Conditional("")]

DLLImport

练习题:

迭代器

1.IEnumerable

2.IEnumerator

yield return

特殊语法

​编辑

可空类型

语法糖 ?

空合并操作符 ??

$

值类型与引用类型补充

排序

插入排序

希尔排序

归并排序

快速排序

堆排序



指定类型用List  。不指定类型ze使用ArrayList   ,它里面装的是Object,可以存放任意数据。(需要using System.Collections;)  尽量多用List,避免频繁的拆装箱

返回内容“true”的索引号

insert需要指定索引位置和插入的内容

array[1]  array.indexof(1)  根据索引返回内容、根据内容返回索引

                                                     容量和长度是两个东西

尽量少用。取出时需要拆箱,这也是我没有给它一个标题的原因,了解它的API即可

你把它取出来的时候它是object,所以得拆。好处是什么都能装

练习题:ArrayList

而且不要直接使用Contains,因为传进来的物品数量不一样,不可能相等的

这个练习我缓存了,直接看复习

这种写法的意思是,赋值就按赋值的算,不赋值就是1

重载可以偷懒调用前面的方法,但也需要斟酌该做法是否需要修改上面的方法内容。

后面是栈Stack、队列Queen,这哥仨都需要using System.Collections;     且同样没有类型限制

但这两没法中间拿,只能一个一个出和取也不能查中间

但仍然可以用Contains判断存在

之所以不把判断长度写在while里是为了维持死循环一直去判断,这样后期往里面加消息的时候它也会去输出。不然直接断了,等不到后面

普通列表List<>

哈希表

Hashtable  以前没怎么说过,其实就是键值对

键值都是object类型前面是键名,后面是值

键与键不能重复                     查找用键来查找  hashtable[键名]

可以改成任意类型,不管之前是什么

遍历
没办法用for循环去遍历

这个count只能得到长度有多少个数,无法用它进行遍历

 Keys  Values

接下来的3和4不怎么常用

DictionaryEntry本质是一个键值的结构体

练习题

设置成私有的构造函数外界就不能去新建对象,只能内部新建。

我可以在加的时候创建怪物,而不是一开始就创建怪物,Id就从0开始生成

泛型

可以在实例化的时候把泛型改成别的类型,也可以保持为T(改过一次之后就固定不能再改了)

但是继承的时候要写具体的类型,就不能再写T了尖括号内可以写多个

另外,泛型方法是必须加<>的

这不是泛型方法这才叫泛型函数,且不能和类的T同名

因为你申明Test2 t2 = new Test2<int>的时候就已经确定了类型,就只能传递固定类型

泛型约束 关键字 where T:

会让里面的类型变得可变,创建时指定

可以写多个约束多个泛型↓

注意某些约束之间可能有冲突

练习题

只要继承了这个基类的就可以使用instance(存在无参公共构造函数)

有时候不能用==判断相等

因为这个列表里面本来存放的也是默认值,有新值进来才等于进来的值

就加一个静态的,可以让它变成唯一的,防止每次都创建一个新列表

每个子类继承它。并实例化的时候都会把自己装进父类里面的这个列表中

字典 DIctionary

 只有stack和queue不能用[] 

遍历:keys、values、

输入数字,输出汉字大写。dic是一个字典<int,string>

不区分大小写

链表

系统有自带一个LinkedList的双向链表,但这里我们了解一下它的原理,所以自己写逻辑。

注意:这只是个结点   链表在下面

Add方法

头尾一开始相等,指向同一区域。 然后尾结点的下一个变为新结点,新结点更新为当前的尾结点

那么删除呢,node.next=node.next.next  看懂了吗    原来的引用就消失了

Remove方法

如果要删头结点,让下一个结点等于新的头结点就好了。如果没有下一个,尾结点也置空

判断完特殊情况还没有返回,就是普通情况

从头开始遍历,一直找到没有下一个为止,中间发现某个结点的下结点等于传入的值时,让这个结点的下结点等于下结点的下结点,相当于把中间要删的结点给置空了。

else node=node.next

遍历  

其实之前已经说了,

总结

经常增删数据,用链表。  增删较少而查找频繁,用顺序表。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值