第一章 .NET Framwork框架介绍
1..NET Framework 由公共语言运行时(CLR)和.NET Framework基类库(FCL)这两个主要组件组成
2.公共语言运行时是.NET Framework的基础
3.公共语言运行时用于管理内存、线程执行、代码执行、代码安全验证、编译以及其他系统服务
4.公共语言运行时有一项服务称为GC(垃圾收集),它能为你自动管理内存,GC自动从内存中删除程序汇中不再访问的对象
5.CLR:公共语言运行时 FCL:.Net Framework基类库 GC:垃圾收集机制 MSIL:微软中间语言 CTS:通用类型系统 CLS:公共语言规范 JIT:即时编译
6.公共类型系统(CTS):用来约束类型 公共语言规范(CLS):用来约束语法
7.即时编译器将MSIL代码转换为可由CPU直接执行的计算机代码
8.C#其本身而言只是一种语言,尽管它是用于生成面向.NET环境的代码,但它本身不是.NET的一部分
9.C#命名空间:命名空间内的类型称为命名空间的成员,一个源文件可以包含多个命名空间的声明,引入命名空间的语法using 命名空间名称
10.命名空间名称:
(1)命名空间名称可以是任何有效标识符
(2)命名空间可以包含句点符号,用于把命名空间组织成层次
(3)不要把命名空间命名为与类或类型相同的名称
(4)语法:namespace 命名空间的名字 { 定义类 }
11.程序中错误:
(1)语法错误:不遵循语言规则,就会产生语法错误,语法错误在编译时就会报错。
(2)运行时错误:当程序试图无法执行的操作时,就会产生运行时错误,运行时错误在程序运行过程中发生。
(3)逻辑错误:在程序运行过程中不符合需求的处理,在程序运行过程中发生
12.C#中所有异常的父类:Exception
13.C#中使用try和catch语句块来捕获处理异常,try中编写可能出现异常的C#代码,一旦代码出现异常,就会立即传送到catch中进行处理,如果不出现异常,catch中的代码就不会执行,不管代码如何控制,都会执行finally中的代码
14.关于try....catch...finally块中使用的注意点:
(1)勿将try…catch用于流程控制
(2)不得声明空的catch块
(3)避免在catch块中嵌套try…catch
15.C#中使用throw引发异常
第二章 C#类与对象
1.在面向对象设计中,类封装了数据,而类的成员方法作为其对外的接口,抽象地描述了类
2.面向对象编程简称OOP技术
3.对象:具有明确定义的状态和行为的具体实体
4.类:具有相同特征和行为的一组对象的集合
5.属性:对象拥有的特性
6.方法:对象执行的操作
7.面向对象编程设计的特点:封装、继承、多态
8.类是抽象的,而对象是具体的,类是对象的抽象形式,对象是类的具体形式
9.类是封装的最基本的单位,封装防止了程序相互依赖性而带来的变动影响,在类中定义的接收对方消息的方法称为类的接口
10.继承是从一个现有的类创建新类的过程,现有的类称为父类,新类称为子类,子类可以访问父类的属性和方法
11.多态性是指同名的方法可在不同的类中具有不同的运动规律
12.类的命名规则:
(1)不能为C#中的关键字
(2)不能包含空格或点号‘.’
(3)可以是下划线‘_’、字母或‘$’符号开头
13.类的声明:修饰符 class 类名 { 类成员 }
14.类只能使用public和internal两种修饰符
(1)public:所修饰的类的可访问域是它所在的程序和任何应用该程序的程序,因此访问不受限制
(2)internal:所修饰的类的可访问域是定义它的的程序,当类没有指定访问修饰符时,默认的访问修饰符是internal
15.类的成员:属性和方法
16.声明方法:修饰符 返回值类型 方法名称(参数列表) { 方法体 }
17.方法的修饰符:public、private、protected、internal
(1)public:所属类的成员以及非所属类的成员都可以访问
(2)internal:同一程序可以访问
(3)protected:一般放在父类中,只有其子类可以访问
(4)private:只有所属类的成员才能访问
19.声明类的实例使用关键字:new
20.属性的作用:防止非法字段的录入,为私有字段赋值;通过属性成员的访问器访问类中的某个字段,可以隐藏类中的字段,很好的体现了类的封装性
21.属性的声明:访问修饰符 数据类型 属性名 { get{} set{} }
22.将字段封装成属性的快捷键:Ctrl+R+E
23.get访问器是一个不带参数的,用于向外部指定字段的值,通常使用return语句返回某个变量的值,get访问器是在取属性是自动调用
24.set访问器是一个返回类型为void的方法,用于处理类外部的写入值,带有一个特殊的关键字value,value是set访问器的隐式参数
25.属性分为3种:
(1)可读可写:具有set()和get()访问器的属性
(2)只读:只有get()访问器的属性
(3)只写:只有set()访问器的属性
26.方法的参数:
(1)值参数:被调用的方法不会修改内存中的实参的值
(2)引用参数:被调用的方法会改变调用方法的参数值,需要用到关键字ref,(数组作为参数传递时相当于引用参数传递)
(3)输出参数:用于从方法传递回一个结果,需要用到关键字out
(4)数组型参数:需要用到关键字params,必须位于参数列表的最后一个,传参时可以传数组名,也可以传数组元素
第三章 C#方法
1.类的成员分为:实例成员,静态成员
2.由类生成对象的过程称为类的实例化过程
3.一个类在使用前必须将其实例化,才能使用其内容的方法和属性,如果这个方法或属性被定义为静态static就可以直接调用
4.静态字段通过类名访问,实例字段通过类的方法访问
5.静态变量不赋初值时,默认为0
6.静态方法能访问其他静态成员,但是不能访问实例成员
7.静态方法中不能直接调用实例方法,实例方法中国年可以直接调用静态fangf
8.静态类中所有成员都是静态的,静态类用于封装不受实例数据影响的数据和方法
9.静态类:
(1)类本身必须用static修饰
(2)类的所有成员必须是静态的
(3)不能继承静态类
10.方法的重载是指在同一个类中一旦方法名称相同,但各方法中参数的数据类型、个数或顺寻不同
11.方法的重载特点:
(1)参数的类型不同
(2)参数的个数不同
(3)参数的类型顺序不同
12.构造函数是一个特殊的成员函数,在创建对象时由系统自动调用
13.构造函数的特点:
(1)构造函数没有返回值类型,也没有返回值
(2)构造函数可以有多个
(3)任何对象要创建成功必须调用相应的构造函数
14.构造函数的语法:访问修饰符 类名(参数列表) { 构造函数主体 }
15.如果在类的声明中没有显示定义的构造函数,那么编译器会提供一个隐式的默认的不带任何参数的构造函数,当显示的定义了一个构造函数,则编译器将不会提供这个默认的构造函数
16.创建构造函数,每个类系统都会提供一个默认的无参的构造函数,实例化对象时,首先调用的时类的无参构造函数。 注:如果用户自定义了构造函数,则系统不再提供无参的构造函数
17.readonly可以在声明或构造函数中初始化,const字段为编译时常量,readonly为运行时常量,const总是静态的,readonly可以是静态的,也可以是非静态的
18.声明索引器的语法:访问修饰符 数据类型 this[数据类型 标识符] //this表示索引器的名称,只能用this { get{} set{} }
19.InitializeComponent() 初始化窗体
第四章 C#基本数据类型
1.C#中的数据类型分为:值类型和数据类型
2.值类型:
(1)简单类型(如int,double,float等)
(2)结构类型(Struct types)
(3)枚举类型(Enum types)
3.引用类型:
(1)类
(2)接口
(3)数组
(4)字符串
4.值类型:变量储存的是实际值,默认值为0
5.引用类型:变量储存的是引用或指针,默认值为null
6.将一个值类型变量赋值给另一个值类型变量时,变量的值被赋值
7.将引用类型的变量赋值给另一个引用类型的变量时,只是变量中的内存地址被复制
8.将引用类型转换为值类型称为装箱
9.将值类型转换为引用类型称为拆箱
10.枚举是一个指定的常数,用来放一组特定的值
11.枚举可以转成int型,int型也可以转成枚举型
12.使用枚举时的注意点:
(1)它们不能定义自己的方法
(2)它们不能实现接口
(3)它们不能定义属性或索引
(4)枚举成员之间用逗号隔开
(5)枚举成员如果没有赋值,那么它的第一个值默认为0
(6)后面的成员取值是前一个成员取值+1
17.枚举的声明可以出现在类声明相同的地方,枚举的声明包含枚举名称,访问权限,内在的类型和枚举成员 语法:访问修饰符 enum 枚举名称 {枚举成员 }
18.如果一个枚举类没有显示声明它的内在类型,则默认为int
19.枚举成员的取值必须和枚举声明的内在类型相同,并且必须在类型的范围之内
20.最好使用枚举的地方:
(1)在定义静态常量时,如果值是按照一定顺序排列的,可以用枚举定义
(2)当参数、返回值、变量等类型可以是枚举时,不要使用其他基础类型
22.结构是程序员自定义的类型,有数据成员和方法成员,结构不支持继承,声明结构的语法和声明类相似
23.类和机构的区别:
(1)类是引用类型,结构是值类型
(2)创建对象时类必须使用new关键字,而机构可不用
(3)类支持继承,结构不支持继承
(4)类声明字段时可以赋初值,结构声明字段时不能赋初值
(5)类可以声明无参的构造函数,结构只能声明带参数的构造函数
第五章 C#面向对象之继承与多态
1.一个类的子类拥有这个类的所有公共属性
2.创建新类所继承的基础类称为基类或父类,而基类或父类所派生出的新类称为子类或派生类,子类可以说是基类的具体化
3.继承的特性:传递性和单根性
4.任何类都可以从另一个类继承,但一个子类只能继承一个基类,不能同时继承多个类
5.所有类的基类都是System.Object
6.子类继承父类,首先调用的是父类的无参构造函数
7.当父类中只有有参构造函数,子类必须继承父类的有参构造函数,当父类中只有无参构造函数,则子类不必继承
8.base关键字只能在子类中使用,调用父类的非私有成员,也可以访问父类的成员
9.使用base访问父类的构造函数:子类构造函数(参数列表):base(参数名称)
10.使用sealed定义的类是密封类,让该类无法再被继承
11.如果子类中定义的成员与父类重名了,可用new修饰符修饰它
12.is关键字可以判断一个对象是否是某个类的实例,as关键字可以一个子类转成一个父类 eg:(child as Parent).Print();(将child转成Parent,称为里氏替换原则)
13.里氏替换原则:继承必须确保基类所拥有的性质在子类中仍然成立,子类可以替换父类,并且出现在父类能够出现的任何地方,但是父类对象是不能替换子类的
14.继承规则:
(1)继承是可以传递的
(2)派生类是对基类的扩展
(3)基类的构造函数和析构函数不能被继承
(4)类可以定义虚方法、虚属性,它的派生类能够重载这些成员,从而实现继承具有多态性
15.通过base访问基类的注意点:
(1)可以在创建子类实例时调用基类的构造函数
(2)基类访问只能在构造函数、实例方法或实例属性访问器中进行
(3)在静态方法中使用base关键字是错误的
(4)不能使用base关键字访问基类的私有成员
16.多态性的定义:同一操作作用于不同类的实例,不同的类将进行不同的解释,最后产生不同的执行结果
17.C#中用virtual关键字,将方法定义为支持多态的虚方法,被virtual定义的类方法,子类可以使用override关键字实现各自不同的方法
18.override关键字用于子类中修改基类方法的实现,采用override重写的方法在基类必须定义为virtual(虚方法)或abstract(抽象方法)
19.如果子类使用new隐藏了基类的成员,就不能再该成员声明中使用override关键字,new、static、virtual关键字不能与override一起使用
20.使用virtual定义类成员,以及使用override重写基类成员的注意点:
(1)基类的虚成员被重写时,需要使用相同的访问修饰符
(2)在类的成员声明前加上virtual关键字后,不能再有abstract、static或override关键字
(3)如果子类使用new隐藏了基类的成员,就不能在该成员声明中使用override关键字
(4)new、static、virtual关键字不能与override一同使用
21.Object是所用类的基类
第六章 C#中接口与抽象类
1.C#中使用abstract关键字定义的类称为抽象类
2.如果一个类中包含了一个抽象方法,那么这个类必须为抽象的
3.一个非抽象类如果派生出自一个抽象类,就必须重写这个抽象类中的所有方法
4.抽象方法没有大括号{},在方法中的()后直接加分号,抽象方法只有方法的定义,没有方法的实现
5.定义抽象类与抽象方法的目的是为子类提供一种约定,约束子类的行为
6.虚方法在任何类中使用virtual,抽象方法在能在抽象类中使用abstract,虚方法可以不重写,使用override重写,,抽象方法必须重写,使用override重写,虚方法可以有方法实现,也可以6没有方法实现,抽象方法不能有方法实现,指定参数后直接用分号结束声明
7.抽象类的特点:
(1)抽象类是子类的描述,就像模板,只有被子类继承,才有实际意义
(2)抽象类不能被实例化
(3)抽象类不能是密封的或者是静态的
(4)抽象类中除了抽象方法,还可以有普通方法,但包含抽象方法的类一定是抽象类
8.抽象类不能被实例化,但可以声明抽象类的对象,将该对象指向子类的引用
9.抽象类对象引用子类实例后,基本上还是属于抽象类,能够访问子类重写的方法和父类自己的属性和方法,子类自己的属性和方法是不能访问的,除非将对象强制转换成子类
10.接口(interface)是表示一组方法成员而不提供成员具体实现的引用类型,类可以实现接口,在所有可以声明类的地方都可以声明接口
11.类实现接口时,必须实现接口中的所有方法
12.声明接口时的注意点:
(1)接口的成员只能是方法 、索引以及属性,不能包含字段,构造函数和常量
(2)接口中的成员隐式是公开的,不能显示指定访问修饰符
(3)接口中的方法、索引以及属性不能有任何实现
(4)接口中最常用的成员是方法,在接口中定义方法时只需给出返回值类型、方法名称和参数列表,然后分号结束
(5)可以理解接口为一种特殊的抽象类
(6)接口的命名一般以“I”开头
(7)接口中不包含构造函数,所有接口不能实例化
13.接口中声明的访问修饰符只能是public和internal,然而接口的成员是隐式public的,不允许有任何方法修饰符,包括public
14.只有类和结构才能实现接口,类或结构要实现接口的注意点:
(1)在基类列表中包含接口名称
(2)为每个接口的成员提供实现
(3)实现接口与继承类的语法相同,实现多个接口使用逗号隔开
15.一个类要实现多个接口,要求它必须实现这些接口的所有成员
16.显示实现接口中的方法,调用时,需要将子类引用拿给父类接口,才能调用到显示实现接口
17.类的基类实现了某接口,那么类也同时继承了基类中实现接口的方法,且在基类中可以将实现接口的方法定义为虚方法,用于子类重写
18.当一个类要实现从另一个接口继承来的接口时,该类就必须提供接口继承链中定义的所有成员的实现
第七章 C#中集合与泛型集合
1.集合中的对象也称为集合中的元素
2.使用集合时需要引入命名空间System.Collections
3.常用的集合类:ArrayList(列表集合:使用大小可按需动态增加的数组实现IList接口)、Hashtable(哈希表:表示键(key)/值(value)对的集合,这些键/值对根据键的哈希代码进行组织)
4.ArrayList(列表集合)是非常常用的集合类型,需要建立一个对象数组,但不能预先知道数组的大小就可以使用ArrayList
5.ArrayList集合中的每个元素都是object类型,还可以是类类型
6.ArrayList的容量通常大于或等于Count值,如果添加元素时Count值超出,则列表的容量会自动增加一倍
7.ArrayList集合的常用方法:Add将对象添加到ArrayList的结尾处,Clear从ArrayList中移除所有元素,Remove删除指定对象名的对象,RemoveAt删除指定索引的对象
8.Hashtable(哈希表)将数据作为一组键(key)/值(value)对来存储,其中key通常可以用来快速查找,value用于存储对应于key的值,Hashtable表中的key/value键字对均为object,Hashtable可以支持任何类型的key/value键值对,但key键必须是唯一的
9.ArrayList和Hashtable的区别:
(1)功能上:ArrayList可遍历、插入和删除元素、可排序,Hashtable可遍历、插入和删除元素
(2)添加元素:都是Add()方法
(3)获得元素数量:都是Count()属性
(4)删除元素:ArrayList中Remove()和RemoveAt(索引),Hashtable中Remove(key值)
(5)清空元素:都是Clear()方法
(6)判断元素存在:ArrayList中Contains()方法,Hashtable中ContainKey()和ContainValue()分别判断键和值是否存在 (7)查找元素:ArrayList中通过索引,Hashtable中通过键
10.命名空间System.Collections.Generic包含定义泛型集合的接口和类
11.System.Collections.Generic命名空间中的List<T>类的用法类似于ArrayList类,这里的T是指传入的参数的类型
12.List<T>类的声明:List<传入参数的类型>=new List<传入参数的类型>(),在声明时已经强制规定了元素的类型,所以在添加元素时,就只能添加指定类型的元素
13.System.Collections.Generic中也有一个键值对的泛型集合Dictionary<Tkey,TValue>称为字典,语法:Dictionary<int,Object> dic =new Dictionary<int,Object>()
14.List<T>是ArrayList的泛型实现,Dictionary是Hashtable的泛型实现
15.泛型集合与普通结合的对比:
(1)泛型集合的命名空间System.Collection.Generic,普通集合的命名空间System.Collectioin
(2)泛型集合实现的接口时泛型接口,普通集合实现的是普通接口
(3)泛型集合的元素类型通过参数指定,普通集合的元素类型是任何类型
(4)泛型集合插入元素不需要转换类型,普通集合插入元素需要转换为Object类型(自动装箱)
(5)泛型集合取出元素不需要转换类型,普通结合取出元素需要从Object转换为指定类型(值类型的自动拆箱,引用类型需要强制装换)
第八章 TreeView控件与ListView控件
1.ListView控件用于以视图类型或样式显示列表项或样式显示列表项,其显示类型包含大图标、小图标、列表或详细信息,ListView控件命名通常以“lvw”为前缀
2.ListView的常用属性:
(1)view属性:用于获取或设置项在控件中的显示方式。Details表示显示详细信息,可以显示列的标题,LargeIcon显示大图标,SmallIcon显示小图标,List显示列表
(2)FullRowSelect属性:用于指定是只选某一项,还是选择某一项所在的整行
(3)GridLines属性:指定控件中是否显示网格线
(4)Items属性:表示ListView控件上所有ListViewItem的集合,SubItems获取包含该项的所有子项的集合
(5)Columns属性:表示ListView控件中所有列标题的集合
3.TreeView控件的常用属性:
(1)Nodes属性:获取TreeView控件的所有节点集合
(2)SelectNode属性:获取或设置当前控件中选定的树节点
4.创建一个节点:
(1)先创建一个TreeNode节点对象 TreeNode node=new TreeNode();
(2)通过父节点的Nodes属性的Add方法添加 父节点.Nodes.Add(node);
5.TreeNode的常用属性:Level表示获取TreeView控件中树视图的深度(从0开始),常用方法:Expand表示展开树节点,ExpandAll表示展开所有子树节点
第九章 委托与事件
1.当要把方法传递给其他方法时,需要使用委托
2.委托是一种引用方法的数据类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为
3.委托类型是密封的,不能被继承
4.使用委托的步骤:
(1)定义委托(可以在定义类的任何地方定义委托) delegate 返回值类型(必须与传入的方法的返回值类型相同) 委托名称(参数列表)
(2)创建委托实例 除了使用new实例化委托之外,还可以将一个方法直接赋值给委托对象,进行委托的实例化并初始化
(3)调用委托
5.如果委托有返回值并且在调用列表中有一个以上的方法,会发生下面的情况:
(1)调用列表中最后一个方法返回的值就是委托调用返回的值
(2)调用列表中所有其他方法的返回值都会被忽略
6.定义委托时的注意点:
(1)委托通常定义在命名空间或类中
(2)委托的返回值类型和参数,都要和将传入的方法相同
(3)委托可用new实例化,也可像普通变量一样定义,赋值
(4)委托可同时封装多个方法,执行的顺序与封装的顺序一样
7.可以通过匿名方法创建委托对象 委托名() { 匿名方法块; };(分号不能省略)
8.匿名方法不会显示声明返回值,然而,实现代码本身的行为必须通过返回一个在类型上与委托的返回类型相同的值来匹配委托的返回类型,如果委托有void类型的返回值匿名方法就不能返回值
9.事件是类在发生其关注的事情时用来提供通知的一种方式
10.事件的处理步骤:
(1)定义事件(使用委托调用已订阅事件对象中的方法) 访问修饰符 event 委托类型 事件名
(2)订阅事件
(3)通知订阅者发生的事件
第十章 文件及IO操作
1.文件是存储在外部介质(光盘、磁盘等)上的数据集合,计算机是以文件为单位对数据进行管理的
2.包含文件并用组织文件系统的对象称为目录(Windows操作系统中称为文件夹)
3.文件操作需要引入命名空间System.IO
4.文件的操作步骤: (1)创建一个文件流
(2)创建一个相应的读写器(reader and writer)
(3)执行读写操作
(4)关闭读写器
(5)关闭文件流
5.File类是一个密封类,不能被继承,不能被实例化
6.File类提供用于创建、复制、删除、移动和打开文件的静态方法并协助创建FileStream对象,File类所有成员都是静态的
7.FileInfo类提供用于创建、复制、删除、移动和打开文件的实例方法
8.FileStream类表示操作文件的流,使用FileStream类对文件系统上的文件进行读取、写入、打开和关闭操作
9.FileStream有多种重载构造函数
(1)使用指定了路径和创建模式初始化FileStream的实例化 public FileStream(string,FileModel){} (FileModel是一个枚举类型指定如何打开或创建文件)
(2)使用指定的路径、创建模式和读/写权限初始化FileStream类的新实例 public FileStream(string,FileMode,FileAccess){} (FileAccess是一个枚举,指定访问文件的权限)
(3)使用指定的路径、创建模式,读/写权限和共享权限创建FileStream类的新实例 public FileStream(string,FileMode,FileShare){} (FileShare是一个枚举类型,指定如何在进程中共享文件)
10.使用BinaryReader与BinaryWriter可以读写二进制文件
第十一章 多线程
1.使用多线程时需引入命名空间System.Thread(提供支持多线程编程的类和接口)
2.创建线程的两种方法:
(1)ThreadStart myStart=new ThreadStart(方法名称) Thread myThread=new Thread(myStart)
(2)Thread myThread=new Thread(方法名称)
3.仅仅创建线程实例将不会开始线程,需要使用Start()方法
4.线程同步要用到关键字lock(this)锁定线程
5.Priority属性设置或获取线程的优先级的值
(1)Highest:最高
(2)AboveNormal:较高
(3)Normal:普通(默认情况下)
(4)BelowNormal:较低
(5)Lowest:最低
第十二章 序列化和反射
1.序列化就是将对象的状态信息转换为可以存储或传输的格式的过程
2.序列化的目的:
(1)以某种存储形式使自定义对象持久化
(2)将对象从一个地方传递到另一个地方
3.使用二进制序列化:
(1)需要引入命名空间System.Runtime.Serialization.Formatters.Binary
(2)根据一个路径创建一个文件流,文件流应该是可写的,文件可以是任何类型
(3)创建一个BinaryFormatter对象,直接使用new关键字
(4)使用BinaryFormatter对象调用Serialize()方法,该方法有两个参数,第一个参数指定要使用的文件流对象,第二个参数指定要序列化的对象
(5)清空并关闭文件流
4.反序列化是从特定存储介质中的数据重新构建对象的过程
5.自定义的类的对象如果要实现序列化,那么定义类时必须指定类的一个特性“[Serializable]”
6.使用反射需要:
(1)引入命名空间System.Reflection,
(2)使用Assembly定义和加载程序集
(3)使用Type获取关于类型声明的信息
(4)使用ConstructionInfo获取构造函数的信息
(5)使用MethodInfo获取方法的信息
(6)使用ParameterInfo获取参数的信息
7.Type类为反射机制的核心,它是用于储存数据类型的信息,它提供许多方法和属性,且可用的属性都是只读的
8.使用Assembly加载程序集时:Assembly.Load()的参数不要后缀名 Assembly.LoadFrom()的参数要后缀名
9.Invoke()用于执行方法的方法