NET的魅力
- 面向对象四大优点
- 复用性
- 扩展性
- 维护性
- 灵活性
- 强大的Web支持
- 支持云计算
- .NET框架结构
- .NET
- 公共语言运行时(CLR)
- CTS:语法和数据类型各不相同
- CLS:成为公共语言规范
- 框架类库(FCL)
- 是一个综合性的面向对象的可重要类型集合
- 类和对
- 类和对象本质上的区别,类定义了一组概念的模型,而对象是真实的实体
- 类是概念
- 对象是实体
- 关系
- 由对象归纳为类,是归纳对象共性的过程
- 在类的基础上,将状态和行为实体化对象的过程称之为实例化
- 封装——面向对象三大特征之一
- 封装又称为信息隐藏:是指利用抽象数据类型讲数据的操作结合在一起,使其构成
- 一个不可分割的独立实体
- 隐藏内部的细节
- 保留对外的接口
- 封装带来的好处
- 保证数据的安全性
- 提供清晰的对外接口
- 类内部实现可以任意修改,不影响其他类
- 类是最基本的封装
- 总结
- 1,Microsoft.NET是一个面向网络,支持各种用户终端的开发平台
- 2,.NET框架的主要内容是CLR,FCL,ADO.NET,XML,ASP.NET,WinForm和Web Servic等
- 3,CLR是所有.NET应用程序运行时的环境,是所有.NET应用程序都要使用的编程基础
- 4,FCL是一个宝藏,常用的命名空间下的类库需要我们在学习中掌握和灵活运用
- 5,MSDN文档提供了.NET框架类库的详细技术说明,善用MSDN可以提高我们分析和解决问题的能力
- 6,类图是表示结构及类与类之间的关系图表
- 值类型和引用类型
- 值类型
- 源于System.ValueType命名空间,每个值类型的对象都有一个独立的内存区域用于保存自己的值,值类型所在的内存区域称之为“栈”(stack)。
- 不同的变量会分配不同的存储空间,存储空间中存储的是该变量的值
- 改变一个变量值不会影响该到另一个变量值
- 引用类型
- 引用类型源于System.Object命名空间中
- 引用数据类型,赋值是把对象的引用传递给另一个引用两个引用指向同一块内存空间
- 对于引用类型,赋值是把原对象的引用传递给另一个引用,对数组而言,当一个数组引用赋值给另一个数组引用后,这两个引用指向同一个数组,也就是指向同一块储存空间
- 结构
- 语法
- 访问修饰符 struct 结构名{//结构体}
- 结构的特点
- 值类型
- 具有较快数据提取速度
- 结构中可以有字段,也可以有方法
- 定义结构时,结构中的字段不能给初始值
- 结构可以不new,但是无属性,要给所有的属性赋值才能调用方法
- 装箱和拆箱
- 将值类型转换为引用类型称之为装箱反之为拆箱
- 在实际开发中,应该尽量减少不必要的装箱和拆箱,因为二者的储存方式不同,转换时性能损失较大。
- 不同类型的参数传递
- 使用值传递,在方法中对参数值得到更改在调用后不能保留
- 使用ref方式传递,可以保留对参数值的更改
- 值传递和引用方式参数传递
- 使用值方式(不用ref修饰)传递参数时,参数在方法中修改不会保留
- 使用值方式(不用ref修饰)传递参数时,参数在方法中的修改会保留
- 使用引用方式(用ref修饰)传递值类型或者引用类型参数时,参数在方法中的修改都会保留
- 总结
- 1,基本数据类型,比如整型,浮点型,字符型,bool型及其结构属于值类型:数组,接口和类属于引用类型
- 2,值类型转换为引用类型成为装箱,反之为拆箱
- 3,以值方式传递值类型参数时,对它的修改不会被保留,以值方式传递引用类型参数时,其值的修改将会保留
- 4,以引用方式传递引用类型或值类型参数时,其值的修改都会被保留
- 5,结构是值类型数据,可以看成轻量级的类,使用的时候可以不用new
- 集合
- ArrayList
- 类似于数组,成为数组列表ArrayList可以动态维护
- 导入System.Collections命名空间
- 添加数据使用
- 集合名.ADD方法
- 获取单个元素
- 通过索引来访问
- 在集合中的类型属于object需要强制类型转换
- 删除元素
- 通过索引删除:RemoveAt(index);
- 通过对象名删除:Remove(对象名);
- 清空集合数据:集合名.clear();
- Hashtable
- 添加数据
- 集合名.ADD()方法
- 获取元素
- 通过键名
- 集合名【keys】
- 删除元素
- 通过键名
- 集合名称.Remove("键名");
- 遍历循环
- 泛型和泛型集合
- 导包
- 导入System.Collections.Generic命名空间
- 语法
- List<T> 对象名=new List<T>();
- List<T>和Array的区别
- 相同点
- 通过索引访问集合中的元素
- 添加元素方法相同
- 删除元素方法相同
- 不同点
- List<T>
- 对保存元素进行类型约束
- 添加/读取值类型元素无须拆箱装箱
- ArrayList
- 可以增加任何类型
- 添加/读取值类型元素需要装箱和拆箱
- Dictionary<k,y>和Hashtable的区别
- 相同点:
- 通过Keys获取values
- 添加元素方法相同
- 删除元素方法相同
- 遍历方法相同
- 不同点
- dictionary<k,y>
- 对所保存的元素进行类型约束
- 添加/读取值类型元素无须拆箱和装箱
- hashtable
- 可以增加任何类型
- 添加/读取值类型元素需要拆箱装箱
- hashtable
- 常用的方法和属性
- count:
- 获取包含在hashtable中键/值对的数目
- Keys
- 获取包含在hashtable中键的集合
- values
- 获取包含在hashtable中值的集合
- 总结
- ArrayList集合可以通过动态维护,访问元素时需要进行类型转换
- ArrayList集合删除数据时,可以通过索引或者对象名称访问其中元素
- hashtable类似于生活中的字典,他的元素都是以键/值对的方式存在的,访问其中的元素需要进行类型转换,遍历hashtable时,可以遍历其keys和values。
- hashtable不能通过索引访问,只能通过Keys和values。
- 可以通过集合初始器构造集合对象
- 泛型是c#2.0中的一个新特性,通过泛型可以最大限度地重用代码,保护类型的安全及提高性能
- 泛型集合可以约束他所存储的对象类型,访问集合中的元素无须进行类型转换
- list<T>和ArrayList的用法相似,list<T>访问元素无须进行类型转化
- dictionary<K,Y>和hashtable的用法相似,dictionary<K,Y>访问元素无须类型转换
- 泛型集合可以作为类的一个属性,使用泛型集合必须实例化
- 对于一些常常处理不同类型数据转换的类,可以使用泛型定义,定义泛型类的构成与定义一个累相似,不同之处在于,尖括号里定义了类型参数。
- 类的方法
- 构造函数
- 构造函数的特点:
- 方法名与类名相同、
- 没有返回值类型
- 主要完成对象的初始化工作
- 无参构造函数
- 语法
- 访问修饰符 类名(){}
- 在默认的情况下,系统将分配给类一个无参构造函数,并且没有方法体
- 带参构造方法
- 语法
- 访问修饰符 类名(参数列表){}
- 方法的重载
- 一个类中的方法与同一个方法同名,但是参数列表不同
- 方法:
- 在一个类中用相同的名称,但是不同的参数类型创建一个以上的过程,实例构造函数或者属性
- 重载的特性:
- 在同一个类
- 方法名与类名相同
- 与访问修饰符和返回值无关
- 参数列表与参数类型不同
- 对象交互
- 每个类都有自己的特性和功能,我们把它们封装成方法和属性。对象之间通过属性和方法进行交互,可以认为方法的参数及其方法的返回值都是对象间相互传递的消息。
- 总结
- 带参构造函数提供了初始化对象时的多种选择,我们可以有选择的初始化相应的属性
- 如果没有各类添加显式构造函数,那么系统在初始化对象时会调用隐式构造函数,并且系统会根据属性的数据类型给其赋予默认值
- 构造函数通常与类名相同,构造函数不声明返回值,一般情况下,构造函数总是public 类型
- 方法重载是指方法名相同,而参数列表和参数类型不同,在同一个类中,构造函数和普通方法都可以重载
- 同一个类,方法名相同,参数列表相同,但返回值类型不同的方法不能构成方法的重载
- 在面向对象的程序中,对象通过公开方法和属性完成与其他对象的交互,可以认为方法的参数及其方法的返回值都是对象间相互传递的消息
- 继承和多态
- 什么是继承?
- 在面向对象的编程中,有两种截然不同继承类型:实现继承和接口继承
- 实现继承:
- 表示一个类型派生于基类型,它拥有该基类型的所有成员字段和函数。在实现继承中,派生类型采用基类型的每个函数的实现代码,除非在派生类型的定义中指定某个函数的实现代码。在需要给现有的类型添加功能,或许多相关的类型共享一组重要的公共功能时,可以使用这种类型的继承。
- *接口继承:
- 表示一个类型只继承了函数的签名,没有继承任何的代码。在需要指定该类型具有某些可用的特性时,最好使用这种类型的继承
- 一个类可以继承另一个类
- 继承的语法:
- public class 子类名:父类{//方法体}
- base关键字:
- 表示父类,可以用于访问父类的成员
- 调用父类的方法及其构造函数,如果父类成员是私有的那么将无法访问父类成员
- protected访问修饰符:
- 这个修饰符成员允许子类访问,而不允许其他非子类访问
- is a 关系
- 被继承的类称为父类或者基类
- 继承其他类的类称为子类或者派生类
- 子类与父类之间必须符合 is a 的关系
- 两大特性
- 单根性:是指子类只能继承一个父类,不能同时继承多个父类
- 传递性:子类是可以继承父类的特性,同时子类也可以作为其他类的父类
- 多态
- 虚方法
- 实现方法的重写
- 父类中定义方法,用virtual关键字定义虚方法
- 在子类中定义自雷自己的方法,用override关键字来修饰,就实现了父类方法的重写
- 定义父类变量,用子类对象初始化父类变量
- 总结
- 继承必须符合is a的关系,被继承的类成为父类或者基类,继承其他类成为子类或者派生类
- 继承机制很好解决了代码复用的问题
- 子类集成父类的成员,并且可以拥有自己特有的成员
- 被protected访问修饰符修饰的成员允许被其子类访问,而不允许其他非子类访问
- base关键字可以用于调用父类属性,方法和构造函数
- 继承具有传递性,如果class A:B ,class B:C A也可以访问C的成员
- C#中的继承具有单根性,一个类不能够同时继承自多个父类
- 在子类,如果不适用base关键字来显示调用父类构造函数,将隐式调用父类默认的构造函数
- 如果重载的构造函数有一个没有使用base关键字来指明调用父类的哪一个构造函数,父类必须提供一个默认的构造函数
- 多态按字面的意思就是多种形态指同一操作作用于不同的对象时,可以有不同的解释,产生不要、同的执行结果
- 可以使用虚方法实现多态
- 深入了解多态
- 里氏替换原则(LSP)
- 在一个软件系统中,子类对象可以替换所有使用的父类对象,且程序行为没有变化
- is和as操作符的使用
- is用于检查对象和指定的类型是否兼容
- as用于两个对象之间的类型转化,转化失败返回null
- 抽象类和抽象方法
- 抽象方法
- 语法:
- 访问修饰符 abstract 返回值类型 方法名();
- 注意:
- 抽象方法没有闭合的大括号,而是直接跟了一个分好,可以说方法没有方法体
- 含有抽象方法的类必须是抽象类
- 实现抽象方法
- 语法
- 访问修饰符 override 返回值类型 方法名{}
- 通过override关键字可以自由的重写方法
- 抽象类
- 语法
- 访问修饰符 abstract 类名{}
- 抽象类提供抽象方法,这些方法只有蒂尼方法,实现友子类重写实现
- 子类是抽象类可不重写
- 父类中访问类型为私有的和静态修饰
- 抽象类不能被实例化
- 面向对象三大特征
- 封装:
- 不可分割是的实体
- 隐藏内部的细节
- 保留对外的接口
- 保证对象自身数据的完整性和完整性
- 继承
- 建立类之间的关系,实现代码的复用,方便系统的扩展
- 多态
- 相同的方法调用可实现不同的实现方式
- 总结
- 里氏替换原则:子类对象可以代替父类对象,反过来,父类对象不能代替子类对象
- 抽象方法是一个未实现的方法,他用abstract关键字修饰,含有抽象方法的类必然是抽象类
- 使用抽象方法不能被实例化,不能密封的或者静态的
- 抽象类的抽象方法要在子类中通过override关键字重写,除非他的子类也是抽象类
- 面向对象的三大基本特性:封装,继承,多态
- is操作符用于检查对象 和指定类型是否兼容。as操作符主要用于两个对象之间的类型转化
- XML
- 什么是XML?
- 称为可扩展标记性语言
- 用于描述数据,是处理当前处理结构化文档信息的有力工具
- XML语言的特点
- 每一对标记称之为节点
- 用于描述数据的各个节点可以自由宽展
- 节点中区分大小写
- XML和HTML语法上的区别?
- HTML的标记不是所有都需要成对出现
- HTML的标记不区分大小写
- XML反之
- 解析XML文件
- 步骤
- 导包:using system xml
- 创建XMLDocument对象
- 加载文件 使用lond方法
- 获取根节点
- 遍历循环子节点
- 操作XML的对象的属性和方法
- 总结
- XML称为可宽展标记性语言,它主要用于描述数据
- 读取一个XML文档使用XMLDocument对象,XML节点使用XMLNode对象表示
- XMLDocument对象的Document属性可以获得XML文档的根节点,ChildNods属性可以获得所有的子节点
- TreeView用于显示具有层次结构的信息,主要属性哟Nods和SelectedNode属性包含了TreeView顶级子节点集合,SelectedNode表示当前选中的节点
- TreeView表示TreeView的节点对象,Text属性属于设置界节点的文字描述,Tag属性可以设置与节点相关的信息
- 通过TreeNode的Add()方法可以给TreeView添加节点Remove()方法可以移除指定节点Clear()方法可以移除指定节点下的加点所有节点
- 文件操作
- 读写文件的步骤
- 导包 using system io
- 创建文件流
- 创建阅读器或者写入器
- 执行读写操作
- 关闭阅读器或者写入器
- 关闭文件流
- FileStream 类
- 语法
- FileStream 文件流对象 =new FileStream (string filepath(路径),FileMode.fileMode);
- Create:用于指定要操作的文件,如果文件存在,改写旧文件
- CreateNew:创建一个文件,如果文件存在就会发生异常,提示文件以存在。
- Open:打开一个文件,使用这个枚举值时,指定文件必须存在,否则会发生异常
- OpenOrCreate:只是如果文件不存在,则用指定的名称新建一个文件并且打开
- Append:打开现有文件,并且在文件末尾追加内容
- 文件读写器
- 语法
- SteamWriter mysr=new SteamWriter (文件流);
- SteamReader读取器、
- SteamReader:主要用于读取流中的数据,
- 方法
- SteamReader.ReadLine();读取文件流中的一行数据,并且返回字符串
- SteamReader.ReadToEnd();从当前位置读到末尾,返回字符串
- SteamReader.Coles();用于关闭读取器
- File类和Directiry类
- static和非静态类的区别
- File类:提供操作文件的各种方法
- Directory 类提供对文件夹的移动、删除等操作
- 使用静态方法的语法
- Fileinfo类
- 属性和方法
- DirectortyInfo类
- 总结
- 读写文件五步骤,创建文件流,创建读写器,执行读写,关闭读写器,关闭文件流
- 文件流的类是FileStream,创建一个文件流,需要指定操作文件的路径,文件的打开方式和文件的访问方式
- StreamWiter是一个写入器,StreamReader是读取器
- File类用于对文件进行操作,比如:复制,移动,删除等,Directory类用于对文件夹进行操作,他们都是静态类
- 静态类只包含实例成员,非静态类可以包含静态成员,静态成员不能包含实例成员,非静态类可以包含实例成员,非静态类使用他的实例成员
- FileInfo类与File类功能类似,也可以完成对文件的基本操作,不同的是File类不可以实例化对象,如果大算多次重用某个文件对象,可以考虑使用FileInfo类,因为并不总是需要安全检查
- DicecoryInfo类与Dicecory类功能类似,可以完成对文件夹的基本操作,如果打算多次重用某个目录对象,可以考虑使用DicecoryInfo类的实例方法