[学习笔记 Day02]C#基础:面向对象程序设计

[学习笔记 Day02]C#基础:面向对象程序设计

面向对象介绍(OOP):

面向对象时当前计算机界最关心的重点,是目前主流的软件开发方式。面向对象的概念和应用已超越了软件开发,扩展到了更广的范围,如数据库系统、交互式界面、分布式系统、网络管理结构、CAD技术和人工智能等领域。

在面向对象出现之前,早期的计算机编程是基于面向过程的方式进行程序设计的。

类:

类的定义:[访问修饰符] class 类名{类的内部成员;}

类的成员:包括字段、属性、方法、常量、事件和索引器等。

封装:

通过提供不同的访问器可以将属性分为三类,分别i为:只有get、只有set和有get、set

构成方法重载的条件有在同一个类中、方法名相同和参数个数或类型不同。(特殊的方法)

构造方法:

  • 构造方法的名字必须与定义它的类名完全相同,并且没有返回值
  • 构造方法是在使用new关键字创建对象时系统自动调用的。
  • 构造方法是在初始化对象成员赋初始值的。

集合:

主要特征:

  • 动态地改变大小
  • 可存储任意类型的对象
  • 提供一系列操作集合中对象的方法

列表集合ArrayList:

定义:ArrayList list变量名 = new ArrayList(){};

使用:

类名 变量名 = new 类名();

list变量名.Add(变量名);

ArrayList的常用属性:

  • Capacity():获取或设置ArrayList可包含的元素个数
  • Count():获取ArrayList实际包含的元素个数

ArrayList的常见方法:

  • Add(object obj):将元素添加到ArrayList结尾处
  • Insert(int index,object obj):将元素添加到ArrayList的指定索引处
  • Remove(object obj):移除ArrayList指定的元素
  • RemoveAt(int index):移除ArrayList指定索引处的元素
  • Clear():清除ArrayList中所有的元素
  • Sort():对ArrayList中的元素排序
  • Reverse():将ArrayList中的元素顺序反转
  • TirmToSize():将ArrayList容量数设置为实际元素个数

字典集合Hashtable:

注意

  • 列表集合和哈希表存取数据存在“装箱——拆箱”过程,会极大的损耗性能(最好不要对数据进行装箱和拆箱)
  • Hashtable的key和value都是object类型的,所以在访问时必须从object类型转换回存储前的类型

Hashtable的常见属性

  • Keys:获取包含Hashtable中所有键的ICollection(可以遍历该属性访问Hashtable中所有键)
  • Values:获取包含Hashtable中所有值的ICollecction(可以遍历该属性访问Hashtable中所有值)
  • Count:获取Hashtable中键值对的数目

Hashtable的常见方法:

  • Add(object key,object value):将带有指定键和值的元素添加到Hashtable中
  • Remove(object key):从Hashtable中移除带有指定键的元素
  • Clear():移除Hashtable中所有的元素
  • ContainsKey(object obj):确定Hashtable中是否包含指定键
  • ContainsValue(object obj):确定Hashtable中是否包含指定值

泛型:

泛型是程序设计的一种特性,它允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,并且在使用前做出指明。

泛型最常见的用途是创建集合类,他需要的命名空间是 System.Collection.Generic;

泛型集合List<T>:

List<T>的常用属性:

  • Capaity:获取或设置List<T>中可包含的元素个数
  • Count:获取List<T>中实际包含的元素个数

List<T>的常用方法:

  • Add():将元素添加到List<T>的结尾处
  • Insert():将元素添加到List<T>的指定索引处
  • Remove():移除List<T>中指定的元素
  • RemoveAt():移除List<T>中指定索引处的元素
  • Clear():清除List<T>中所有的元素
  • Sort():对List<T>中元素的排序
  • Reverse():将List<T>中的元素顺序反转
  • ToArray():将List<T>中的元素复制到数组中

泛型字典集合Dictionary<K,T>:

Dictionary<K,T>的常用属性:

  • Keys:获取包含Dictionary<K,T>中所有键的ICollection(可以遍历该属性访问集合中所有键)
  • Values:获取包含Dictionary<K,T>中所有值的ICollecction(可以遍历该属性访问集合中所有值)
  • Count:获取Dictionary<K,T>中键值对的数目

Dictionary<K,T>的常见方法:

  • Add(object key,object value):将带有指定键和值的元素添加到Dictionary<K,T>中
  • Remove(object key):从Dictionary<K,T>中移除带有指定键的元素
  • Clear():移除Hashtable中所有的元素
  • ContainsKey(object obj):确定Dictionary<K,T>中是否包含指定键
  • ContainsValue(object obj):确定Dictionary<K,T>中是否包含指定值

类的继承:

  1. 继承是指子类可以沿用父类的某些行为和特征
  2. 继承的特性有传递性、单根性和访问性

类的继承运用:

  1. 子类会先隐式调用父类的无参构造方法,在调用自身的构造方法。
  2. 可以使用this关键字访问本类成员,使用base关键字访问父类成员;使用base()可以在子类中访问父类的构造方法,使用“base  成员名称”可以在子类中访问父类成员。
  3. 有构造函数使用“:”继承了无参构造方法,所以先运行被继承的无参构造方法,在运行有参构造方法。

访问修饰符:

  • public:公有的,访问不受限制
  • peivate:私有的,只能在本类内部中访问
  • protected:受保护的,只能苯类及其子类访问
  • internal:内部的,只限于本项目内成员访问(同一命名空间可以使用)
  • protect internal:内部保护的,只限于本项目或子类访问

多态:

  • 多态,即多种形态。
  • 在面向对象思想中,多态的主要表现形式是:子类继承父类后对于同一个方法有不同的实现方式。多态的实现方式有隐藏父类方法和重写父类方法。

多态的使用:

子类使用new关键字来达到隐藏父类成员的目的。

注意:在子类中定义和父类同名的方法,不使用new关键字,子类中的方法也可隐藏父类中的同名方法,但编译器将发出警告。

多态的实现:

  1. 父类方法定义为虚方法(使用virtual关键字)
  2. 子类重写方法(使用override关键字)
  3. 创建子类对象,并调用该方法

注意:重写方法时,子类和父类方法的返回值类型、方法名和参数类型必须完全相同,子类方法的可访问性不能低于父类方法。

抽象方法:

  • 使用abstract修饰方法

语法:abstract class{ public abstract void 方法名(){}}

用途:用来被子类重写,必须定义在抽象类中。

注意:抽象类不可以用new关键字实例化。

密封类:

  1. 密封类使用sealed修饰,不能作为父类。因此,密封类主要用于防止派生子类。
  2. 由于密封类不能被继承,所以类中的方法不能定义为虚方法。
  3. 使用sealed修饰的方法被称为密封方法。密封方法是指不允许子类再次重写方法。
  4. sealed修饰方法时只能与override一起使用,防止重写的方法再次被重写。

抽象类:

  1. 在面向对象思想中,所有的对象都可以通过类来描述。但并不是所有的类都是用来描述对象的,如果一个类中没有包含足够能描述具体对象的信息,那么就称之为抽象类。
  2. 抽象类使用abstract关键字来定义抽象类。
  3. C#中子类最多只允许一个父类,如果一个类需要具有多个类的特征或是行为,那么就可以通过接口来实现。

语法:abstract class 类名{}

抽象方法与虚方法的区别:

抽象方法虚方法
使用abstract关键字修饰使用virtual关键字修饰
只能定义在抽象类中可以定义在初密封类以外的类中
不允许与方法体必须有方法体
子类必须重写子类可以重写

接口:

  • 如果一个类需要具有多个类的特征或是行为,那么就可以通过接口来实现
  • C#中的接口用于约束类的行为。

定义接口:[访问修饰符] interface 接口名{}

抽象类接口
使用abstract关键字使用interface关键字
可以包含字段和以实现的成员不能有字段,只能包含未实现的成员
子类通过override实现抽象方法子类直接实现所有成员

文件操作:

  • 在C#中如果对文件进行创建、复制和删除等少量操作,一般使用File和FileInfo类
  • .NET框架提供了Directory和DirectoryInfo类,用于对磁盘和文件夹的操作管理。

文件对话框:

  • 打开文件的对话框OpenFileDialog、保存文件的对话框SaveFileDialog、打开文件夹的对话框FolderBroswerDialog

OpenFileDialog对话框:

private void btnOpen_Click(object obj,EventArgs e)
{
      //判断是否点击为”打开“按钮
      if(ofDialog.ShowDialog()  ==  DialogResult.OK)
      {
            textPath.Text  =  ofDialog.FileName;
      }
}

OpenFileDialog的常见属性:

  1. InitialDirectory:对话框的初始目录
  2. Filter:文件筛选器,按”显示名称 | 类型“格式编写,例如,”文本文件 |(*.text)| *.text | 所有文件(*.*) || *.*“
  3. FilterIndex:在对话框中选择的文件筛选器的索引,如果选第一项就设为1
  4. FileName:第一个在对话框中显示的文件或最后一个选取的文件
  5. Title:将显示在对话框标题栏中的字符
  6. AddExtension:是否自动添加默认的扩展名
  7. CheckFileExists:在用户指定不存在的文件时是否显示警告
  8. CheckPathExists:在对话框返回前,检查指定路径是否存在
  9. DefaultExt:默认扩展名,用户输入文件名时,如果未指定扩展名,则在文件名后添加此扩展名

OpenFileDialog的常用方法:

  1. ShowDialog():运行对话框,返回值为DialogResult类型。

SaveFileDialog对话框:

private void btnOpen_Click(object obj,EventArgs e)
{
      if(sfDialog.ShowDialog()  ==  DialogResult.OK)
      {
            textPath.Text  =  sfDialog.FileName;
      }
}

FolderBroswerDialog对话框:

private void btnOpen_Click(object obj,EventArgs e)
{
      if(fDialog.ShowDialog()  ==  DialogResult.OK)
      {
            textPath.Text  =  fDialog.FileName;
      }
}

FolderBroswerDialog的常用属性:

  1. Description:显示在对话框视图上方的字符串,用来指定显示给用户的指导信息
  2. RootFloder:设置根文件夹位置
  3. SelectedPath:对话框中最先选择的文件夹或用户,最后选择的文件夹完整路径
  4. ShowNewFloderButton:对话框是否包括”新疆文件夹“按钮

文件常用操作:

File类常用方法:

  1. Exists():用于检查文件是否存在
  2. Copy():复制文件
  3. Move():移动文件
  4. Delect():删除文件

注意:与FileInfo类相比,使用FileInfo类可以避免频繁地创建和释放对象的系统开销。但如果需要多次重用某个文件对象,则使用FileInfo类。

文件夹常用操作:

Directory类常用方法:

  1. Exists():用于检查指定文件夹是否存在
  2. Createdirectory():在指定路径创建所有目录和子目录
  3. Move():将指定文件夹移动到新的位置
  4. Delete(string):删除指定空文件夹
  5. Delete(string,bool):删除指定的文件夹中的所有子文件夹和文件

提示:返回指定目录中的所有文件的名称(包括其路径)可以使用Directory.GetFile(string Path)方法。

文件的读取和写入:

读写文本文件最常用的类有FileStream(文件流)、StreamReader(流读取器)和StreamWriter(流写入器)

注意:文本文件的编码使用UTF-8和Unicode格式。

语法:

FileStream  fs  =  new  FileStream(FileName(文件路径),FileMode(打开方式),FileAccess(读/写权限));

FileMode的枚举值:

  1. CreateNew:创建新文件,如果文件已存在,则引发异常
  2. Create:创建新文件,如果文件已存在,则覆盖
  3. Open:打开文件,如果文件不存在,则引发异常
  4. OpenOrCreate:打开文件,如果文件不存在,则创建新的文件
  5. Append:打开文件并查找文件尾,如果文件不存在,则创建新的文件
  6. Truncate:打开当前文件并清楚其内容,如果文件不存在,则引发异常

FileAccess的枚举值:

  1. Read:对文件进行只读访问
  2. Write:对文件进行只写访问
  3. ReadWrite:对文件进行读写访问

注意:操作系统上直接创建文本文件默认为ANSI编码,而StreamReader和StreamWriter默认使用UTF-8编码而不是当前系统的ANSI编码,所以在读取ANSI编码的文本文件会显示为乱码。

StreamReader的常见方法:

  1. Read():读取输入流中的下一个(组)字符
  2. ReadLine():读取当前流中的一行字符,并将数据作为字符串返回
  3. ReadToEnd():读取从当前位置到末尾的所有字符,并将数据作为字符串返回
  4. Close():关闭StreamReader对象和基础流,并释放与读取器关联的所有系统资源

StreamWriter的常用方法:

  1. Write():将数据写入流
  2. WriteLine():将行结束符之前的数据写入流
  3. Close():关闭StreamWriter对象和基础流

序列化和反序列化:

  • 序列化是指将对象实力的状态存储到存储媒介中的过程
  • 序列化的对象需要标记为Serializable

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容