面向对象基础:通过封装对象的属性实现对象的方法和事件得到最终的对象
- 属性封装
①封装就是对象的信息隐藏起来,但要留出访问的接口;
②封装和方法不同,不需要形参,不管是给属性赋值还是引用属性的值,只需要调用封装函数就行;
③封装使用访问修饰符来实现 - 访问器
属性的访问器包含获取或设置属性的可执行语句,它的声明包含get访问器、set访问器,或两者皆可 - 索引器
索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,this表示操作本对象的数组或集合成员,可以简单把它理解成索引器的名字,因此索引器不能具有用户定义的名称。
2,3点的区别:
属 性 索 引 器
允许调用方法,如同公共数据成员 允许调用对象上的方法,如同对象是一个数组
可通过简单的名称进行访问 可通过索引器进行访问
可以为静态成员或实例成员 必须为实例成员
其get访问器没有参数 其get访问器具有与索引器相同的形参表
其set访问器包含隐式value参数 除了value参数外,其set访问器还具有与索引器相同的形参表
4. 访问修饰符
private:私有成员,类内部可访问,类和类成员
public:公开成员,没有访问限制,所有的都可以访问,类和类成员
protected:保护成员,类内部和继承类可访问,类和内嵌类
internal:同一程序集下可访问,类和内嵌类
internal protected/protected internal:同一程序集下可访问,类和内嵌类
其他修饰符
new:函数成员
static:所有成员
virtual:仅函数成员
abstract:仅函数成员
override:仅函数成员
sealed :类、方法或属性,对于类代表密封,不允许继承该类,必须和override一起使用
extern:仅静态方法
面向对象三大特征
- 封装
封装就是对象的信息隐藏起来,但要留出访问的接口,减少代码的冗余性 - 继承:类与类之间的关系,实现代码的多重
子承父业,子类会继承父类的属性、构造、行为
父类具有的子类不一定具有,相反,子类具有的父类也不一定有
不支持多重继承,但可以多重接口继承 - 多态:实现代码多种使用状态,多态性往往表现为"一个接口,多个功能"
- 静态类
①不能实例化
②类里面的成员也必须全部是静态的
③是一个抽象的密封类,所以不能被继承
④不能包含实例构造函数
⑤访问类中的公开成员,直接使用类名点
⑥在静态的方法中只能访问外部的静态成员
非静态类
①非静态类里即可有静态成员,也可以有非静态成员。
②非静态里的静态方法可直接调用即 :< 非静态 类名.静态方法 >
③非静态里的非静态方法需要实例化后才能被调用 - 可选参数
是指在声明方法的时候,给方法的参数设置一个默认值,那么这个参数可以选择不填写,那么在方法中将使用这个方法的默认值。但是可选参数必须定义在不可选参数之后。 - 数组参数
传递数组作为函数的参数。您可以通过指定不带索引的数组名称来给函数传递一个指向数组的指针。 - 参数数组
当声明一个方法时,您不能确定要传递给函数作为参数的参数数目。C# 参数数组解决了这个问题,参数数组通常用于传递未知数量的参数给函数。
例如params 关键字:调用数组为形参的方法时,既可以传递数组实参,也可以只传递一组数组。
多态
重载:方法名称相同,参数列表不同,调用时编译器会根据实际传入参数的形式,选择与其匹配的方法执行;
重写:当一个子类继承父类时,子类中的方法父类中的方法名称、参数个数、参数类型一致时,就说明这个子类重写了其父类。
相同点:都是多态的体现,同名方法
不同点:
重载是参数不同,重写必须一致;
重载可以没有返回值,重写返回值必须一致;
重载编译时多态,重写运行时多态;
重载不需要继承,重写必须继承。
- 虚拟virtual、2. 抽象abstract
抽象方法是只有方法名称,没有方法体,子类继承父类时必须重写父类抽象方法;
(虚拟)虚函数有方法体,子类可以继承父类,也可以重写,但是子类可以覆盖,也可不覆盖。
相同点:都是为了重写
两者区别:
(1)虚方法有方法体,抽象方法没有方法体。抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化;
(2)抽象方法只能在抽象类中声明,虚方法不是;
(3)派生类必须重写抽象类中的抽象方法,虚方法则不必要。 - 接口
就是类与类之间的一种协定、约束,继承接口中的类必须实现接口中的方法,如果某个类继承于接口,就可以直接调用这个方法。接口是一类事物所具有的属性总结,相当于父类
#抽象类与接口的异同#
抽象类:是指含有一个或多个抽象方法的类称为抽象类,声明抽象类时,类名前必须添加abstract关键字,子类继承父类时,可使用override关键字覆盖父类中的抽象方法
相同点:①都可被继承②都不能实例化③都可以包含方法的声明
不同点:①抽象类可以实现类成员,接口中的方法只能声明不能实现;
②抽象类有字段,接口没有字段,但有属性;
③抽象类的成员可以使用公开或其他修饰符,接口不需要修饰;
④抽象类不支持多重继承,只能继承一个类,但一个类可实现多个接口,接口支持多重继承
#类和结构的异同#
不同点:
类:属于引用类型,可以继承和被继承,有构造函数和析构函数,必须有new初始化,可以有字段赋值;
结构:属于值类型,不可以继承和被继承,没有构造函数但可以添加,没有析构函数,可以不new初始化,没有字段赋值
相同点:
①基类型都是对象(object),c#中所有类型的基类型都是object;
②都有属性和方法
#构造函数和析构函数#
构造函数:如果类中没有声明构造函数,则调用类实例时,系统会自动生成一个构造函数。作用:当类被实例化时执行的函数;
析构函数:一个类中只允许一个或没有析构函数。作用:当类生成的对象被释放时自动执行的函数
文件I/O流(用法)
多线程编程
一个程序包含一个进程,一个进程包含多个线程。
1.进程
进程是系统进行资源分配和调度的单位。
2.
线程
线程是CPU调度和分派的单位。
进程在执行过程中拥有独立的内存单元,而多个线程共享内存,
3. 同步
如果一个程序调用某个方法,等待执行完所有处理后才继续执行,我们称这样的方法是同步的。
4. 异步
如果一个程序调用某个方法,在该方法处理完成之前就返回到调用方法,则这个方法是异步的。
异步应用场景及原理:
异步主要应用于IO操作,数据库访问,磁盘操作,Socket访问、HTTP/TCP网络通信
5. 任务
任务表示应完成某个单元的工作。这个工作可以在单独的线程中运行,也可以以同步方式启动一个任务。任务也是异步编程的一种实现方式。
#任务和线程的区别#
①任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行。
②任务跟线程不是一对一的关系