C#总结
第1章 理解.NET Framework与C#
1..NET框架
1)2001年发布的.NET Framework经历5个版本:1.0,1.1,2.0,3.0,3.5
功能强大,主要体现在:
支持多种语言程序
具有强大的内库,提高开发效率
完善的数据安全管理
可开发多种类型的程序
2).NET Framework由框架类库(FCL)和公共语言运行时(CLR)这两个主要的组件组成
CLR包含两个重要组成部分:CTS(通用类型系统)和CLS(公共语言规范)
2.C#语言
1)经历了1.0,2.0,3.0等版本
2)C#的优势:完全面向对象 安全性 可移植性 高性能 适合开发多种不同类型程序
3.命名空间
1)语法:namespace name
{
type-declarations
}
2)最常用的命名空间:
System.Drawing:处理图形和绘图,包括打印
System.Data:处理数据存取和管理,在定义ADO.NET技术中扮演重要角色
System.IO:管理对文件、流的同步和异步访问
System.Windows:处理基于窗体的窗口的创建
System.Reflection:包含从程序集读取元数据的类
System.Threading:包含用于多线程编程的类
System.Colections:包含定义各种对象集的接口和类
3)使用using导入命名空间
4.C#中的命名规范
1)Pascal命名法:每一个单词的首字母都要大写,一般用于命名空间名、类名、方法名
2)Camel命名法:第一个单词的首字母小写,后面每个单词的首字母大写,一般用于变量名等
第2章 面向对象编程——类和对象
1.类和对象
1)类是现实世界中一组具有相同属性和方法的对象的集合,
其中属性用于定义对象所具有的特征,方法用于定义对象可以执行的操作。
对象是一种具有状态(属性)和行为(方法)的数据结构,用来描述现实世界的某个事物
2.类的定义和使用
1)创建类和对象
声明类:
语法:class ClassName
{
//字段
//属性
//方法
}
创建对象:
语法:类名 对象名=new 构造方法(参数列表)
3)字段和属性
字段是类的成员,用来描述一类事物某个特征的变量
封装是隐藏内部实现、对外提供公共操作接口的方式
不同访问修饰符的访问权限:
public:在任何地方都可以访问,无访问限制
private:仅能在定义它的类的内部访问
protected:本类及其子类(可在同一程序集,也可在不同的程序集)
internal:只能在同一程序集
属性是对字段的封装,阻止非法数据的输入,从而保护内部数据的安全
4)方法的定义和使用
语法:访问修饰符 返回值类型 方法名称(参数列表)
{
方法体;
}
方法调用分为3中情况:
A、同一类中方法的调用可以直接通过方法名进行调用
B、同一个命名空间不同类中的方法调用:
a、创建对象
b、通过对象名.方法名进行调用
C、不同命名空间中的方法调用:
a、导入命名空间
b、创建对象
c、通过对象名.方法名进行调用
构造方法:创建对象时自动调用的方法
作用:在创建对象的同时,方便对对象进行初始化
分为无参的构造方法和有参的构造方法
语法:访问类名(参数列表)
{
语句块;
}
注意:构造方法名与类名相同,没有返回值类型
静态方法:通过static关键字修饰的方法成为静态方法
语法:访问修饰符 static 返回值类型 方法名(参数列表)
{
方法体;
}
注意:静态方法中只能访问静态的方法和属性
在调用时只能通过类名.方法名的方式
静态方法与实例方法的区别:
静态方法 实例方法
static关键字 不需要static关键字
只能使用类名调用 只能使用对象调用
只能访问静态成员 可以访问静态成员,也可访问实例成员
调用前初始化 创建对象时初始化
方法重载:是让类以统一的方式处理不同类型数据的一种手段
条件:在同一个类中,具有相同的方法名,具有不同参数
第3章 面向对象编程——继承和多态
1.继承
1)继承是面向对象编程中提供的子类可以沿用父类某些行为和特征的一种方式
当一个类继承另一个类时,被继承的类被成为父类或基类,该类被成为子类或派生类
注意:子类无法完全拥有父类的所有行为和特征
在子类中可以定义本类所特有的行为和特征,是对父类的扩展
2)特点:传递性、相对性、单根性
3)继承的实现
A、定义一个父类
B、定义一个子类,使用“:”符号实现继承
C、定义子类对象使用父类成员
注意:a、若一个类没有继承任何类,则自动继承Object类
b、子类无法继承父类的构造方法,也无法拥有父类的私有成员
c、父类的引用可以指向子类的对象,但子类的引用无法指向父类的对象
d、创建子类对象时,先调用父类的构造方法,再调用子类的构造方法
base和this关键字
this:用于指代类的当前对象,类似于“自己”
用法:this.成员:调用本类中其他的成员
this(参数):在本类的构造方法中调用本类其他构造方法
base:用于指代类的当前对象的父类对象
用法:base.成员:在子类中调用其父类对象的成员
base(参数):在子类中调用其父类对象的构造方法
注意:this和base不能用在静态方法中
在同一个构造方法中,不能同时使用this(参数)和base(参数)
2.多态
1)定义:不同的类对于同一个行为不同处理方式
分类:方法重写和方法隐藏
A、方法重写
可重写的方法:虚方法、override方法、抽象方法
实现:
访问修饰符 override 返回值类型 方法名(参数列表)
{
方法体;
}
注意:重写方法与被重写方法访问修饰符、返回值类型、方法名称和参数必须一致
方法重写时,调用谁的方法,取决使用谁的对象
B、方法隐藏
实现:
访问修饰符 new 返回值类型 方法名(参数列表)
{
方法体;
}
注意:使用方法隐藏时,new关键字可有可无,若不写new关键字将产生一个警告
方法名称和参数必须一致,其他的可以不一致
方法隐藏时,调用谁的方法,取决使用谁的引用
sealed关键字
修饰类(密封类):不允许被继承
注意:抽象类不能是密封类
修饰方法(密封方法):不允许被重写
注意:必须和override一起使用,避免已重写的方法再次被重写
第4章 面向对象编程——抽象类和接口
1.抽象类
1)定义:抽象类是类的部分实现,用于约束其子类的行为,且不同的子类可以在此基础上可以有自己的实现
实现:public abstract class 类名
{
....
}
注意:抽象类不能实例化
抽象类可以包含具体实现的方法
抽象类不能是密封的和静态的
2)抽象方法
定义:存在于抽象类中,仅有方法的声明,而无方法的实现
实现:访问修饰符 abstract 返回值类型 方法名(参数列表);
注意:抽象方法不能有具体的实现
抽象方法一定存在于抽象类中,但抽象类中不一定存在抽象方法
非抽象子类必须实现父类中所有抽象方法(使用override实现)
构造方法、静态方法和密封方法不能是抽象方法
抽象方法不能被private修饰
抽象方法和虚方法比较:
抽象方法 虚方法
abstract关键字修饰 virtual关键字修饰
子类必须通过override重写 子类可以通过override重写
不允许有方法体 必须要有方法体
只能定义在抽象类中 不能定义在密封类中
使用场合:当需要子类进行重写时,若父类中可以给出该方法一般实现,可以将该方法声明虚方法,
若父类中不能给出该方法一般实现,就必须将该方法声明抽象方法
2.接口
1)定义:为了实现某个功能而定义一系列方法的规范和标准
好处:对继承单根性的扩展
提高程序灵活性
定义接口:访问修饰符 interface 接口名
{
...
}
注意:接口中定义的成员不能有具体实现
接口只能定义以下成员:方法、属性、索引器、事件
接口中的成员不能使用任何访问修饰符(默认为public)
实现接口:class 类名:类名,接口名,接口名,....
{
}
注意:子类必须接口中所有成员
子类实现接口中的成员,必须是public且具有相同的声明
子类可以同时继承且实现多个接口,接口的实现必须在类的继承之后
使用接口:使用接口的引用指向实现类对象
注意:接口不能实例化
抽象类和接口的区别:
不同点:
抽象类 接口
使用abstract定义 使用interface定义
可以继承类 不能继承类
可以包含实现方法 方法不能有实现
可以实现接口 可以继承接口
子类实现通过override实现 子类直接实现
相同点:不能实例化
可包含未实现方法
子类须实现未实现的方法
引用可以指向实现类的对象
设计模式:程序员经过总结而得出对某个问题的较完善解决方案
工厂方法设计模式
解决问题:创建实体产品对象,当添加功能时,仅需要添加,而无需修改代码
存在角色:
抽象工厂:用于生产抽象产品
抽象产品:需要被实体产品实现
实体工厂:用于实现抽象工厂,生产实体产品
实体产品:需要实现抽象产品
第5章 C#高级属性——集合
1、集合
定义:一组使用方便,性能优良的数据结构,用于存储对象数据
特点:容量可以自动动态调整
可以存放任意类型数据,其中包含null
提供一系列方法操作集合中对象
存在于System.Collections命名空间中
接口:
ICollection:System.Collections 命名空间中类的基接口,两个重要子接口IList和IDictionary
IList:表示可按照索引单独访问的对象的集合
IDictionary:表示用于存储键/值对且可通过key访问对象的集合
结构:DictionaryEntry:定义可存储的键/值对的数据结构
类:ArrayList:使用大小可按需动态增加的数组
Hashtable:表示键/值对的集合,这些键/值对根据键进行访问
SortedList:表示键/值对的集合,这些键值对按键排序并可按照键和索引访问。
Queue:表示对象的先进先出集合
Stack:表示对象的先进后出集合
2、ArrayList
特点:实现IList接口
可以存储任意类型的对象,包含null且允许重复
容量可以动态改变,增长量为原容量一倍
数据存储时有序
可通过索引访问集合中任意元素,索引从0开始
3、HashTable
特点:实现IDictionary接口
用于存放键/值对,key不允许为null,value可以为null
容量可以动态改变
数据存储时无序
可使用key访问集合中对应value值
key与value一一对应的,key不允许重复,value可以重复
4、SortedList
特点:实现IDictionary接口
用于存放键/值对,key不允许为null,value可以为null
key与value一一对应的,key不允许重复,value可以重复
容量可以动态改变
可使用key或索引访问集合中元素
按照key值进行排序
5、Queue
特点:实现ICollection接口
可以存储任意类型的对象,包含null且允许重复
容量可以动态改变
使用先进先出的方式操作集合中的数据
6、Stack
特点:实现ICollection接口
可以存储任意类型的对象,包含null且允许重复
容量可以动态改变
使用先进后出的方式操作集合中的数据
7、泛型
定义:将类型参数化的一种数据类型,从而实现代码复用(参数的任意化)
参数任意化->参数Object->类型转换不安全->泛型->类型参数化->参数任意化且类型安全
泛型集合都存在于System.Collections.Generic
泛型集合与非泛型集合的区别:
相同点:集合的特点,操作数据方式完全一致
不同点:非泛型集合需要进行类型转换以及装箱和拆箱
泛型集合在定义时已确定该集合操作数据的数据类型,不需要进行类型转换和装箱和拆箱
8、集合中元素的排序
只有集合类中存在Sort方法集合才可以对元素进行排序
排序必要条件:必须实现IComparable<T>接口或IComparer<T>接口
实现IComparable<T>接口
接口定义:public interface IComparable<T>
{
int CompareTo(T other);
}
返回值小于0 时,表明在比较规则下当前对象小于other对象
返回值大于0 时,表明在比较规则下当前对象大于other对象
返回值等于0 时,表明在比较规则下两个对象相等
接口实现:必须进行比较或排序的对象的类去实现
调用:集合对象.Sort();
实现IComparer<T>接口
接口定义:public interface IComparer<T>
{
int Compare(T x,T y);
}
若返回值小于0,表明比较规则下x对象小于y对象
若返回值大于0,表明比较规则下x对象大于y对象
若返回值等于0,表明比较规则下两个对象相等
接口实现:可以定义多个类实现接口,以按照多种方式进行排序
调用:集合对象.Sort(new 排序类());
第6章 C#高级属性——值类型与引用类型
1、枚举
定义:具有一组特定值的自定义数据类型(Boolean),是一种值类型
使用枚举:
定义枚举类型:访问修饰符 enum 枚举类型名
{
值列表
}
注意:枚举类型可以定义在类中,也可以定义命名空间(最好)
枚举类型中的值列表不能重复
枚举类型中不能定义属性和方法
枚举类型中值默认为int,首元素默认0,之后每个元素依次递增1
可以重写枚举类型中默认值
定义枚举变量:枚举类型名 变量名 = 枚举类型名.值;
2、结构
定义:结构与类相似,是一种值类型,用于将一组相关的信息变量组织为单一的变量实体
使用结构:
定义结构:访问修饰符 struct 结构名
{
结构体;
}
注意:结构可以声明类中,也可以声明命名空间中(最好)
结构体中可以定义字段、属性和方法
结构体不能定义无参构造方法
结构体中字段不能直接进行初始化
定义结构变量:
A、不使用new:结构名 变量名;
注意:必须对结构变量中所有字段进行初始化之后才可以使用变量的其他成员
B、使用new:结构名 变量名 = new 构造方法;
注意:结构体不能定义无参构造方法,但在创建变量可以使用无参构造方法
结构与类的区别:
类 结构
不同点 引用类型 值类型
能够被继承 不能被继承
可以有构造方法 只能添加有参构造方法
有析构方法 没有析构方法
使用new创建对象 可以不使用new创建对象
定义时允许初始化字段 定义时不允许初始化字段
相同点 可以定义字段、属性和方法
可以实现接口
3、值类型和引用类型
值类型:变量存放的是要表示的值本身,基本数据类型除去String,加上枚举和结构都属于值类型
引用类型:对象引用中存放的是要表示的值地址,类、接口、String、数组属于引用类型
参数传递:值方式传递和引用方式传递
值方式传递:是参数传递默认形式,将实参的值赋值给形参
值类型参数通过值方式传递时,修改不能被保留
引用方式传递:使用ref关键字实现引用传递方式,将实参所表示的值的地址赋值给形参
值类型参数通过引用方式传递时,修改能够被保留
注意:String类型通过值方式传递无法保存修改,是因为String类型不变性,
若需要保存修改,请使用引用方式传递
out:实现引用方式传递,类似于存储过程的输出参数
ref和out区别
相同点:都实现了引用方式传递
不同点:ref参数必须初始化,out参数可以不初始化
ref侧重修改,out侧重输出
4、装箱和拆箱
装箱:将值类型隐式转换为object类型
工作原理:在堆栈上创建对象引用o,而在堆上则引用int类型的值,该值是赋给变量i的值类型值的一个副本
拆箱:将Object类型显式转换为值类型
工作原理:检查Object对象中装箱值类型是否符合拆箱类型
将装箱值赋值给值类型
注意:装箱前数据类型必须与拆箱后数据类型一致
只有装箱的对象才可以拆箱
5、索引器
定义:可使用多种方式访问对象的数组或集合的一种方式
使用场合:当对象中存在数组或集合可使用
作用:提供多种方式访问
使用更加方便
定义索引器:访问修饰符 返回值类型 this[参数]
{
set{}
get{}
}
注意:索引器的名称必须为this
索引器可以重载
使用索引器:对象[索引];
第7章 C#高级属性——文件操作
1、文件操作
存储数据方式:数据库、文件
数据库存储数据:成本高,但查询数据快、数据安全性较高,适合于比较复杂的查询和数据操作
文件存储数据:成本低、数据存储简单、但数据操作比较麻烦,
同时进行数据处理将出现问题,适用于比较简单数据操作
2、C#中文件处理
所有文件操作的类都存在于System.IO命名空间中
对文件进行操作的类:
File、FileInfo:用于对系统中文件进行操作(获取属性信息、创建、移动、删除等操作)
Directory、DirectoryInfo:用于对系统中目录进行操作
FileStream:用于使用二进制方式操作文件中的内容
从流中读取或写入数据的类:
StreamReader、StreamWriter:用于操作文本文件中内容
BinaryReader、BinaryWriter:用于操作二进制文件中的内容,比FileStream方便
通用IO类:
BufferedStream:带缓存区的IO类,提高读写效率
3、文件操作
可使用File类和FileInfo类对获取或设置文件的属性信息
File类是静态类,类中全部是静态成员,通过类名访问
FileInfo类是非静态类,类中存在实例成员也存在静态成员
静态类 非静态类
使用static修饰 不使用static修饰
只能包含静态成员 可以静态成员,也可以包含非静态成员
只能通过类名调用 类名调用静态成员,对象名调用实例成员
不能包含实例构造方法 可以包含实例构造方法
不能被继承,不能实现接口 可以被继承,也可以实现接口
只能继承Object 可以继承除静态类和密封类之外的类
4、目录操作
可使用Directory类和DirectoryInfo类对获取或设置目录的属性信息
5、使用StreamReader和StreamWriter读写文件步骤:
a.创建FileStream对象
b.创建StreamReader对象或StreamWriter对象
c.使用StreamReader对象读取数据或使用StreamWriter对象写入数据
d.关闭StreamReader对象或StreamWriter对象
e.关闭FileStream对象
第8章 C#高级属性——打印和多线程
1.System.Drawing.Printing命名空间提供以下类用于打印:PrintDocument、PrintController、
PrintPageEventArgs、PrinterSettings、PageSettings
2.在.NET中,提供以下控件来实现打印功能:PrintDocument、PrintDialog、PageSetupDialog
3.1)页面设置对话框:使用PrintDocument和PageSetupDialog控件
2)打印(对话框):使用PrintDialog控件
3)打印(用类):用PrintDocument类,先创建类的实例,设置描述打印方式的属性,再调用Print方法开始打印
4)打印预览(对话框):使用PrintPreviewDialog控件
5)打印预览(用控件):使用PrintPreviewControl控件,并设置Visible属性为false
4.进程包括运行中的程序以及程序所使用到的内存和系统资源。一个进程有多个线程组成,线程是程序中的一个指令流。
5.线程的生命周期
A.Unstarted---Start()-->Running--Wait(),Sleep(),Join()-->WaitSleepJoin--Push(),Interrupt()-->Running
B.Unstarted---Start()-->Running--Suspend()-->SuspendRequested--挂起完成-->Suspended--Rusume()-->Running
C.Unstarted---Start()-->Running--Abort()-->AbortRequested--收到ThreadAbortException异常-->Stopped
6.C#中使用System.Threading命名空间中的Thread类创建线程;使用Thread类中的Priority属性设置线程的优先级。
(优先级有低到高)
成员 线程状态
Lower 将Thread安排在具有任何其他优先级的线程之后
BelowNormal 将线程安排在具有Normal优先级的线程之后,Lowest优先级的线程之前
Normal 默认情况下线程具有Normal优先级
AboveNormal 将Thread安排在具有Highest优先级的线程之后,normal优先级的线程之前
Highest 将Thread安排在具有任何其他优先级的线程之前
6.使用lock语句和Monitor类实现线程同步
第9章 C#高级属性——帮助文档和部署
1.Microsoft HTML Help Workshop 可以方便地建立HTML格式的HELP文档。
2.制作帮助文档的步骤:
a.创建HTML页面
b.创建目录表
c.创建索引
d.创建项目
e.编译项目
3.Help类中的静态方法ShowHelp和ShowHelpIndex可用于接收用户请求帮助显示帮助文档
4.HelpProvider控件:
a.通过HelpPrvider.HelpNamespace属性设置帮助文档的路径和名称
b.设置属性:SetHelpKeyword:检索帮助的关键字
SetHelpNavigator:指定从帮助文档中检索指定控件的帮助信息时使用的帮助命令
c.通过HelpProvider.SetShowHelp属性指定是否显示指定控件的帮助信息(设置为True)
4.将窗体的MaximizeBox属性和MinimizeBox属性设置为false,HelpButton的属性设置为true;
5.可通过Windows Installer的策略部署基于Windows的应用程序
6.Windows Installer部署项目的步骤:
a.创建部署项目
b.设置部署项目的属性
c.设置6种编辑器
d.生成安装程序
e.安装
f.卸载