【C#学习】30泛型,Partial类,枚举,结构


在这里插入图片描述

泛型

泛型:泛化数据类型,与其相对应的是具体化,特化;
比如说,我喜欢听音乐,【音乐】就是一个泛化的词;但如果说:孤独的时候我喜欢听【The Promise】,这首曲子就是被具体化/特化的
泛型在编程中应用非常广泛,影响非常深刻,原因如下:
(1)泛型具有良好的正交性,它和其他编程实体都有正交点:泛型类,泛型接口,泛型方法…
在这里插入图片描述

(2)在.NET Framework中,几乎所有常用的数据类型都是泛型的

泛型类

经典的例子:业务增多的商家
在这里插入图片描述
(1)类型膨胀
在这里插入图片描述
(2)成员膨胀
在这里插入图片描述
(3)无法访问货物
在这里插入图片描述
(4)完美的解决方案:将Box类改成泛化类
在这里插入图片描述

泛型接口

泛型接口在编程中非常常用,需要注意:
(1)如果一个类实现的是泛型接口,那么这个类也是泛型类

(2)但如果一个类实现的是特化之后的泛型接口,该类就不是一个泛型类了
在这里插入图片描述

泛型方法

现代编程最重要的三大技能:算法,数据结构,面向对象
程序之所以能够运行,靠的就是算法(处理数据),在C系语言中(C,C++,C#,Java等),算法的表现形式就是函数,函数在面向对象编程中又称【方法】,所以可以得到推论:如果C#中的方法可以是泛型的,就能证明算法也可以是泛型的
例:拉链方法
(1)方法成员膨胀
在这里插入图片描述
要注意:一旦出现了方法成员膨胀,它比属性,字段等成员膨胀更加危险,因为在这些互为重载的方法中,有绝大部分逻辑是重复的,那就说明:如果想升级其中一个方法的逻辑,其他方法中的逻辑也要做出相应升级;如果其中一个方法中发现了bug,其他方法中必然也会存在相应的bug,一旦忘记升级或忘记修复某个方法,那么问题就会埋藏在代码中

(2)把Zip()方法改成泛型方法
在这里插入图片描述

泛型委托

1.Action,Action<>,Func<>

Action委托封装没有返回值的方法
Func委托封装有返回值的方法
在这里插入图片描述

2.泛型委托与Lambda表达式

  • 什么是Lambda表达式:对于逻辑非常简单的方法,不想去声明它,而是在调用的地方随调用随声明,而且是匿名声明

【一旦声明了一个方法,这个方法的名字就会永远存在于程序的上下文当中,对上下文是一种污染;对于逻辑很简单的小函数,不想让它的名字污染名称空间,所以就会选择用Lambda表达式,把这个名字保留给更重要的方法】
在这里插入图片描述

Partial类

1.什么是Partial类

C#编译器允许我们把一个类的代码分成两部分或多部分来编写,每个部分都能以自己的速度进行版本更新;且允许一个类的不同部分用不同语言来编写

2.为什么需要Partial类?

使用Partial类可帮助我们【减少派生类】
之前学习继承时说过:要把不变的内容写在基类中,在派生类中编写经常改变的内容;但是,如果经常改变的内容较多,就要声明多个/多层派生类,这就会导致派生结构非常复杂
而有了Partial类就好办多了,而且还有一个附加的好处:类名一致(一般情况下,派生类与基类类名不同)

在这里插入图片描述

枚举类型

枚举类型(值类型),实际上就是人为限制取值范围的整数

1.为什么需要枚举类型?

例:编写一个管理软件
在这里插入图片描述
使用枚举类型
在这里插入图片描述

2.枚举值与整数值之间的对应关系

枚举类型的本质:一些限制了取值范围的整数;既然是整数,就有大小之分
如果要看枚举值背后所隐藏的整数值,就要进行显式类型转换
在这里插入图片描述
这个整数值可以设置,修改;编译器会扫描枚举值,当它发现一个枚举值被赋了整数值之后,它就把这个整数值和枚举值对应上,紧接着后面的枚举值如果没有被赋值,它就会在前面的枚举值基础上加一
在这里插入图片描述

3.比特位用法

例:不会唱歌的厨子不是好老师
在这里插入图片描述
未来会看到很多比特位用法,比如读写文件时,会用此来控制文件的打开方式

结构体类型

1.示例
在这里插入图片描述

2.值类型的特点

不同于引用类型,引用类型变量之间赋值时,变量之间copy的是同一个对象的引用;而值类型copy的则是一个完整的对象
在这里插入图片描述

3.结构体是可以实现接口的

4.结构体是不能有自己的基类或基结构体的,也就是说:结构体不可能派生自其他类或结构体

5.结构体类型不能拥有显式无参构造器

发布了32 篇原创文章 · 获赞 3 · 访问量 1114

猜你喜欢

转载自blog.csdn.net/weixin_44813932/article/details/104112569