C# 学习笔记

本文详细阐述了面向对象编程中的类与结构的区别,包括它们的类型、继承和构造函数的差异。同时,介绍了面向对象的三大思想:分而治之、高内聚低耦合和封装变化。接着,讨论了类的七大设计原则,如单一职责、里氏替换和依赖倒转。此外,还涵盖了对象的唯一性、分类性以及多态性等关键概念,以及接口、抽象类和接口隔离的重要性。最后,提到了委托、事件、字典和反射等其他核心概念。
摘要由CSDN通过智能技术生成

类和结构基本的不同点:
1 类是引用类型,结构是值类型。
2 结构不支持继承。
3 结构不能声明默认的构造函数。
4 结构体中声明的字段 无法赋予初值 类可以
5 结构体的构造函数中必须为结构体所有字段赋值,类的构造函数无此限制

面想对象的三大思想:1、分而治之 2、高内聚、低耦合3、封装变化

类的七大原则:1、单一职责 2、里氏替换(继承后重写)3、依赖倒转(依赖抽象)4、接口隔离(功能拆分)5、面向接口编程而非面向实现 6、优先使用组合而非继承(复用的最佳实践)7、开/闭原则 。
!!迪米特法则:类与类之间没有交互,又叫做最少知识原则,也就是说,一个对象应当对其他对象尽可能少的了解

面向对象的特征:1、对象唯一性 2、分类性 3、继承性4、多态性(多形性)

面对对象的三大特征:
1、继承
2、多态
3、封装
.
面向对象的思想:
先去思考框架,包含哪些东西,再去做。
让程序更接近人的思想。
接口 抽象类:封装方法
分而治之:一层管理一层
高内聚、低耦合:
高内聚:两个类有共同的属性和方法尽量提出来做父类,就是在类中把方法和属性紧密的联系在一起。关系越简单越好,不会牵一发动全身
低耦合:尽量的一个类实现一个功能方法,自己扫自家门前雪

封装:
把一个或多个属性或者方法封装在逻辑中可以反复调用。
public:所有对象都可以访问;
private:对象本身在对象内部可以访问;
protected:在父类里面声明 父类和子类可以访问;
internal:同一个程序集(命名空间-)的对象可以访问;
原则:把痛苦留给自己,方便让给别人。

继承性:
继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节省开发时间。

一个父类可以有多个子类,但每个子类只能有一个父类。

优点:
反复调用代码的一种方式。
概念统一,以层级管理。
缺点:
耦合度高,父类能直接改变子类

继承中的构造方法:
构造方法不会继承给子类,但是在创建子类对象时,会自动调用父类的构造方法。
继承执行顺序:
先去看一下有没有父类,有父类 先父后子
base 关键字:子类用的,给父类传参的。
为什么需要构造方法:
因为构造方法是创建对象的唯一通道
为什么要重载构造方法:
声明两个以上的同名方法,得到不同初始状态的对象
构造方法之间可不可以互相调用:
可以,本类构造方法互相调用通过this关键字,
子类调用父类的构造方法通过base关键字。

sealed 关键字:
如果用来修饰类,称为密封类,此类无法被继承
如果用来修饰方法,该方法无法被重写。

多态性:
父类 变量名=new子类
可以new不同的子类
多态性增强了软件的灵活性和重用性。
重写:
只要父类中的方法名称,实现自己的功能。
重载:
多个构造函数或者多个方法。

虚方法:
1、Virtual 关键字修饰方法
2、子类 可重写 也 可不重写该方法。
3、子类重写该方法必须要加上override
4、拥有方法体
抽象方法:
1、abstract关键字修饰方法
2、子类必须重写,子类重写该方法必须要加上override。
3、没有方法体

方法被标记sealed不能被重写

面对对象的概念:
万物皆对象
对象具有状态(属性)
对象还有操作(方法)
方法用于改变状态的行为。
对象实现了属性和方法的结合,使属性和方法封装与对象的统一体中

类:
类的对象由什么组成及在这个对象上可执行什么操作。
构成类的方法和变量成为类的成员
具有相同或相似性质的对象的抽象就是类。对象的抽象是类,类的具体化是对象,也可以说类的实例是对象。
类具有属性,他是对象的状态的抽象,用数据结构来描述类的属性
类具有方法,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。

类的结构:
两种主要关系 一般 具体结构关系 “或”关系
整体 部分结构关系 “与”关系 也可以说是“包含”

对象的唯一性:
每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。
标识:系统会给它一个哈希码

分类性:
分类性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。

按类去划分结构、属性…

开闭原则:
对于扩展是开放的,而对于修改是关闭的。

类的单一职责:
一个类尽量定义一种功能或者一类功能或者与类关系密切的功能。
影响变化的因素越少,维护性越好!

面向接口编程而非面向实现 (写一个类时从哪入手)
做之前先思考一个完整的框架,然后再去做。

优先使用组合而非继承 (复用的最佳实践)
组合的耦合性比继承低。

依赖倒置 ( 依赖抽象)
因为抽象的是稳定的。实现是多变的。

里氏替换 (继承后的重写)
子类对象是可以赋给父类对象的,也可以说子类可以替换父类,并且出现在父类能够出现的任何地方.反过来,父类对象是不能替换子类的
儿子可以替换父亲! 父亲不可以替换儿子!

接口隔离 (功能拆分)
尽量定义小而精的接口,少定义大而全的接口
而接口隔离更多是为了“高内聚”

类与类的四大关系:
泛化:类与类的继承关系。
实现:实现类与接口之间的关系。
关联:整体与部分的关系,另一个类作为当前类的成员出现。
Class Head{ }
Class Person{ Head head;}

依赖:类与类的协作关系,另一个类型作为当前类型的方法的参数或返回值类型出现。
Class A
Class B{ void F(A a)}

抽象类,抽想方法:
关键字 abstract(加在类上是抽象类,加在方法上是抽象方法,可被重写)
抽象类的特点:
抽象类不能创建对象(不能当做Main方法使用)
可以有抽象方法或者不是抽象方法
抽象方法必须是抽象类 抽象类可以没有抽象方法
抽象类可以里面什么都没有

抽象类的用途:
作为基类,封装所有子类的属性或者方法
抽象类只表示做什么,往往不表达具体做什么

何时使用抽象类:
表达抽象概念时,
不希望类创建对象时,
有多个概念需要统一管理时,
有方法,但不需要实现时,
有一些方法,需要子类去自己表达时,

抽象方法:
只有声明没有实现的方法

抽象方法的特点:
只能写在在抽象类中
抽象方法放在接口中:这个抽象方法不能用abstract修饰!
实现类:
在基类中有个重写的方法,在父类没有写,在子类中必须要写

抽象方法语句/含义:
抽象方法只表达这个行为,不管他是具体要干嘛的

抽象等于就是有个玩的方法,具体怎么玩就是子类的事了

抽象方法就是在方法上面加上 abstract
虚方法就是在方法上面加上 virtual

抽象方法必须重写
虚方法可以不用重写

接口:
接口不能用public abstract等修饰。
接口内不能有字段变量,构造函数。
接口内可以定义属性(有get和set的方法)。
如string color { get ; set ; }这种。
实现接口时,必须和接口的格式一致。
必须实现接口的所有方法。

什么是接口:
使用关键字interface 创建的数据类型。
“I”开头
单词首字母大写

概念:
接口只关注行为,不关注数据,且不关注行为的实现,实现由实现类完成
接口中的方法只有头没有体
接口中的所有成员不能加任何访问修饰符

void start();写法

拓展现有类的行为。
规范现有类的行为。

接口回调:可以是任何类型(必须是有那个接口的类)

类回调:必须是继承于父类的

1.接口的特点
接口的定义是指定一组函数成员而不实现成员的引用类型,其它类型和接口可以继承接口。定义还是很好理解的,但是没有反映特点,接口主要有以下特点:
(1)通过接口可以实现多重继承,C# 接口的成员不能有 public、protected、internal、private 等修饰符。原因很简单,接口里面的方法都需要由外面接口实现去实现方法体,那么其修饰符必然是 public。C# 接口中的成员默认是 public 的,java 中是可以加 public 的。
(2)接口成员不能有 new、static、abstract、override、virtual 修饰符。有一点要注意,当一个接口实现一个接口,这2个接口中有相同的方法时,可用 new 关键字隐藏父接口中的方法。
(3)接口中只包含成员的签名,接口没有构造函数,所有不能直接使用 new 对接口进行实例化。接口中只能包含方法、属性、事件和索引的组合。接口一旦被实现,实现类必须实现接口中的所有成员,除非实现类本身是抽象类。
(4)C# 是单继承,接口是解决 C# 里面类可以同时继承多个基类的问题。

集合:ArrayList List u = new List();
Array1List 储存object类型
基本上都是用List
特点:
删除或者添加元素的时候会自动改变大小,通过位置索引取元素。
缺点:
输入删除速度慢。

声明动态数组
ArrayList arrayList = new ArrayList();

列表长度 count

添加一个元素 Add(什么类型都行);

添加一组元素 AddRange(new int[] { 1,5,2,1,5});

移除所有元素 Clear

是否包含 Contains(元素) 返回bool值 True包含 False不包含

获取ArrayList中的子集 GetRange(开始索引,获取个数)

查找元素的索引 IndexOf(索引) 从前往后查

查找元素的索引 LastIndexOf(索引) 从后往前查

插入元素 Insert(插入的索引,插入的元素)

插入一组元素 InsertRange(2,new int[] { 2, 4 });(插入的索引,插入的集合或数组)

删除元素 Remove(要删除的元素) 删除第一个出现的元素

从指定索引删除元素 RemoveAt(索引)

删除一组元素 RemoveRange(删除的开始索引,删除的个数)

逆转集合 Reverse()

委托:
方法的代理 方法的抽象
调用委托就是调用那个方法
委托和类同级 委托是一种数据类型
委托委托的方法必须和委托的签名一致。

委托的使用步骤:
1、定义委托
2、创建委托实例【创建委托数据类型的对象】
Delegate_A delegate_A = new Delegate_A();
//写法1:传统标准写法
AAAAA aaaaa = new AAAAA(delegate_A.A);
//写法二:传统标准写法
AAAAA aaaaa = delegate_A.A;
aaaaa();
//写法三:匿名写法 不能复用
AAAAA AA = delegate ()
{
Console.WriteLine(“A”);
};
3、调用委托 【像调用方法一样】
委托:
是一种声明了返回值和参数组成的数据结构。
事件:
事件是委托的应用。
事件是用来实现两个或多个行为的联动调用的。
字典:
Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值)
键必须是唯一的,而值不需要唯一的。

特性:是用来描述程序里面各种元素行为信息的声明性标签 使用 []
元数据:是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件或存储在内存中的程序进行描述。有关程序及其类型的数据。
反射:一个运行的程序查看本身的元数据或者其它程序集的元数据的行为

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值