第1章 深入,NET框架
(1).NET框架的过人之处
Ø 提供了一个面向对象的编程环境,完全支持面向对象编程。
Ø 对Web应用的强大支持。
Ø 对Web Service(Web服务)的支持。
Ø 实现SOA,支持云计算。
Ø 支持构建.NET程序的炫彩外衣。
(2).NET框架体系结构
.NET框架可以安装在Windows操作系统上,支持C#,VB,.NET,C++.NET等开发语言,也就是我们所说的跨语言开发。
,NET框架具有两个主要组件:CLR和FCL。CLR是.NET框架的基础。FCL是一个综合性的面向对象的可重用类型集合。
(3)CLR(公共语言运行时)
它是所有.NET应用程序运行时环境,是所有.NET应用程序都要使用的编程基础,它如同一个支持.NET应用程序运行和开发的虚拟机。
3.1 CTS
C#和VB.NET都是CLR的托管代码,它们的语法和数据类型各不相同,通用类型系统用于解决不同语言数据类型不同的问题。
3.2 CLS
编程语言的区别不仅在于类型,语法或者说语言规范也都有很大区别。因此.NET通过定义公共语言规范(CLS),限制了由这些不同点引发的互操作性问题。凡是遵循这个标准的语言在.NET框架下都可以实现相互调用。
(4),NET编译技术
为了实现跨语言开发和跨平台的战略目标,.NET所有编写的应用都不编译成本地代码,而是编译成微软中间代码。它将由JIT编译器转换成机器代码。例如,C#和VB,NET代码通过它们各自的编译器编译成MSIL。MSIL遵循通用的语法,CPU不需要了解它,再通过JIT编译器编译成相应平台专用代码,这里所说的平台是指我们的操作系统。这种编译方式,不仅实现了代码托管,而却能够提高程序的运行效率。
如果想要某种编程语言也支持,NET开发,需要有能够将这种语言开发的程序转换为MSIL的编译器。
(5)FCL(框架类库)
这些类库是我们进行软件开发的利器。
FCL的内容背组织成一个树状命名空间。每一个命名空间可以包含许多类型及其他命名空间。
,NET框架核心类库及其功能。
Ø System:此命名空间包含所有其他的命名空间。
Ø System.Collections.Generic:支持泛型操作。
Ø System.IO:支持对文件的操作,如复制,粘帖,删除以及对文件的读写等。
Ø System.Net:支持对网络协议的编程。
Ø System.Data:提供对表示ADO.NET结构的类的访问。
Ø System.Windows.Forms:用于开发Windows应用程序。
Ø System.Drawing:支持GDI+基本图形操作。
第2章 深入C#数据类型
(1)值类型
源于System.ValueType家族,每个值类型都有一个独立的内存区域用于保存自己的值,值类型数据实在的内存区域称为栈。如int、float、doule、枚举类型等。
对于值类型,不同的变量会分配不同的存储空间,并且存储空间中存储的是该变量的值。赋值操作传递的是变量的值,改变一个变量的值不会影响另一个变量的值。
(2)引用类型
源于System.Object家族。在C#中引用类型主要包括数组、类和接口等。
对于引用类型,赋值是把原对象的引用传递给另一个引用。对数组而言,当一个数组引用赋值给另一个数组引用后,这两个引用指向同一个数组,也就是指向同一块存储空间。
(3)结构
结构的定义:
访问修饰符 struct 结构名
{
//结构体
}
结构的使用:
结构的使用和类相似。在使用结构时,需注意:
Ø 可以不用new,直接定义结构的对象即可。
Ø 声明结构的对象后,必须给结构的成员赋初值。
结构的使用经验
结构是值类型,声明结构变量就存储一个结构的新副本,即系统要开辟一块新的存储空间,因此结构用得越多所消耗的存储空间也越多。
(4)装箱和拆箱
我们说数据类型按照存储方式可以分为值类型和引用类型,两者仍然可以相互转换。将值类型转换为引用类型的过程称为装箱,反之称为拆箱。
引用类型à值类型:拆箱
值类型à引用类型:装箱
在实际开发中,应该尽量减少不必要的装箱和拆箱,因为二者的存储方式不同,转换时性能损失较大。
(5)不同类型的参数传递
Ø 使用值传递,在方法中对参数值的更改在调用后不能保留。
Ø 使用ref方式传递,可以将对参数值的更改保留。
使用值方式(不用ref修饰)传递值类型参数时,参数在方法中的修改不会保留。
使用值方式(不用ref修饰)传递引用类型参数时,参数在方法中的修改会保留。
使用引用方式(用ref修饰)传递值类型或引用类型参数时,参数在方法中的修改都会保留。
第3章 使用集合组织相关数据
(1)集合概述
数组的大小是固定的,可以建议一个类似于动态的“数组”,对其动态的进行增加,删除操作。
(2)ArrayList
ArrayList非常类似于数组,也有人称它为数组列表,ArrayList可以动态维护。
ArrayList的容量可以根据需要自动扩充,它的索引会根据程序的扩展而重新进行分配和调整。
ArrayList提供了一套列方法对其中的元素进行访问,增加和删除操作。
ArrayList类属于System.Collections命名空间,这个命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合。。
ArrayList的常用方法及属性 | ||
属性名称 | 说明 | |
Count | 获取ArrayList中实际包含的元素数 | |
返回值类型 | 方法名称 | 说明 |
int | Add(Object value) | 将对象添加到ArrayList的结尾处 |
void | RemoveAt(int index) | 移除ArrayList指定索引处的元素 |
void | Remove(Object value) | 从ArrayList中移除特定对象 |
void | Clear() | 从ArrayList中移除所有元素 |
(3)Hashtable
在ArrayList我们通常都是用索引访问它的元素,但用这种方式必须了解集合中某个数据的位置。当ArrayList中的元素变化频繁时,要跟踪某个元素的下标就比较困难了。
这时,可以给集合中的每个元素分别起个有意义的关键字,然后通过关键字来访问其中的元素。
C#提供了一种称为Hashtable的数据结构,通常称为哈希表,也有人称它为“字典”。
Hashtable也是属于System.Collection命名空间,它的每个元素都是一个键/值对。
Hashtable的常用方法及属性 | ||
属性名称 | 说明 | |
Count | 获取Hashtable中键/值对的数目 | |
Keys | 获取包含Hashtable中键的集合 | |
Values | 获取包含Hashtable中值的集合 | |
返回值类型 | 方法名称 | 说明 |
void | Add(Object key,Object value) | 将带有指定键和值的元素添加到Hashtable中 |
void | Remove(Object key) | 从Hashtable中移除带有特定键的元素 |
void | Clear() | 从Hashtable中移除所有元素 |
(4)泛型和泛型集合
泛型是C#2.0中的一个新特性。
泛型引入了一个概念:类型参数。
通过使用类型参数(T),减少了运行时强制转换或装箱操作的风险。
通过泛型可以最大限度的重用代码,保护类型的安全及提高性能。
它的最常见应用就是创建集合类,可以约束集合类中的元素类型。
(5)泛型集合List<T>
在System.Collections.Generic命名空间中定义了许多泛型集合类,这些类可以代替我们前面学习的ArrayList和Hashtable。
定义List<T>泛型集合:
语法:
List<T> 对象名 = new List<T>();
注:“<T>”中的T可以对集合中的元素类型进行约束,T表明集合中管理的元素类型
List<T>添加一个元素的方法和ArrayList是一样的。
获取元素,删除元素,以及遍历一个List<T>的方法和ArrayList的用法都是类似的,但List<T>保障了类型安全性。
List<T>与ArrayList的区别 | ||
异同点 | List<T> | ArrayList |
不同点 | 对所保存元素做类型约束 | 可以增加任何类型 |
添加/读取值类型元素无需拆箱、装箱 | 添加/读取值类型元素需要拆箱、装箱 | |
相同点 | 通过索引访问集合中的元素 | |
添加元素方法相同 | ||
删除元素方法相同 |
(6)泛型集合Dictionary<K, V>
Dictionary<K,V>具有泛型的全部特性,编译时检查类型约束,获取元素时无须类型转换。
Dictionary<K,V>的存储方式和Hashtable类似,也是通过Key/Value(键/值)对元素进行保存的。
定义一个Dictionary<K,V>:
语法:
Dictionary<K,V> 对象名 = new Dictionary<K,V>();
注:<K,V>中的K表示集合中Key的类型,V表示Value的类型。
Dictionary<K,V>和Hashtable的对比 | ||
异同点 | Dictionary<K,V> | Hashtable |
不同点 | 对所保存元素做类型约束 | 可以增加任何类型 |
添加/读取值类型元素无须拆箱、装箱 | 添加/读取值类型元素需要拆箱、装箱 | |
相同点 | 通过Key获取Value | |
添加元素方法相同 | ||
删除元素方法相同 | ||
遍历方法相同 |
遍历Dictionary还可以采用下面的形式:
foreach(KeyValuePair<string,SE> en in engineers)
{
Console.WriteLine(en.Key);
Console.WriteLine(en,Value.Name);
}
(7)泛型类
语法:
public class 类名<T>
{
//…….
}
注:T指类型参数,带包具体的数据类型,可以是类类型,也可以使基本数据类型。
对于一些常常处理不同类型数据转换的类,可以使用泛型定义。定义泛型类的过程,与定义一个类相似。不同之处在于,尖括号里定义了类型参数。
(8)泛型的优点
性能高。普通集合的数据,需要装箱和拆箱的操作,而泛型无须类型的转换操作。
类型安全。泛型集合对它所存储的对象
第4章 深入类的方法
(1)构造函数特点:
Ø 方法名与类名相同。
Ø 没有返回值类型。
Ø 主要完成对象的初始化工作。
(2)无参构造函数
缺点:对象实例化后的属性值是固定的。
(3)带参构造函数
语法:
访问修饰符 类名(参数列表)
{
//…方法体
}
(4)隐式构造函数
C#有一个规定,一旦类有了构造函数,就不再自动分配构造函数。
(5)方法重载概述,特点
在同一个类中定义多个方法名相同、参数列表(参数个数,参数类型,参数顺序)不同的方法,称为方法重载。
特点:
Ø 方法名相同。
Ø 方法参数类型不同,或者参数个数不同,或者参数顺序不同。
Ø 在同一个类中
好处:
方法重载不仅能避免命名的麻烦,还能使调用者不必判断方法名就可直接调用。
(6)对象交互
在面向对象的程序中,方法名相同,而参数类型和参数个数不同。在同一个类中,构造函数和普通方法都可以重载。
第6章 初识继承和多态
(1)继承概述
被继承的类称为父类或基类,继承其他的类的类称为子类或者派生类。
继承要符合is a 的关系。
(2)base关键字和protected修饰符
protected:
被其修饰的类只能被其子类访问,不允许被其他非子类访问。
(3)子类构造函数
1、隐式调用父类构造函数
默认可以调用父类无参构造函数。
创建子类对象时会首先调用父类的构造函数,然后才会调用子类本身的构造函数。
2、显示调用父类构造函数
是要在子类的构造函数后添加“:base(参数列表)”,就可以指定该子类的构造函数调用父类的哪个构造函数了。
(4)多态体现的方面
Ø 方法的参数。
Ø 数据的初始化。
Ø 返回值。
(5)继承的特性
1、继承的传递性。
2、继承的单根性。——C#不支持多继承。
(6)密封类sealed
用sealed修饰的类是不能被继承的,常见的string就是密封类。
(7)继承的价值
Ø 继承模拟了现实世界的关系。符合面向对象编程的思考方式。
Ø 继承实现了代码的重用。
Ø 继承使得程序结构清晰。
(8)多态的概念
多态的字面意思就是“多种形态”,指同已操作作用于不同的对象时,可以有不同的解释,产生不同的执行结果。
方法重载也称为方法的多态。
可以用虚方法实现多态。
第7章 深入理解多态
(1)里氏替换
原则上子类对象可以赋给父类对象,也可以说子类可以替换父类丙炔出现在父类能够出现的任何地方,且程序的行为不会发生变化。但是反过来,父类对象是不能替换子类对象的。这种特效被称为“里氏替换原则”。
(2)is和as操作符的使用
is操作符用于检查对象和指定的类型是否兼容。
as操作符主要用于两个对象之间的类型转换。
as和强制转换的区别就是,as转换失败的话会返回null,不会异常。
(3)抽象类和抽象方法abstract
抽象类不能被实例化。
抽象类不能是密封的或者静态的。
抽象类的方法不一定都是抽象方法,但是,含有抽象方法的类必然是抽象类。
抽象方法必须在其子类中实现,除非它的子类也是抽象类。
虚方法与抽象方法的区别 | |
虚方法 | 抽象方法 |
用virtual修饰 | 用abstract修饰 |
要有方法体 | 不允许有方法体 |
可以被子类override | 必须被子类override |
除了密封类外都可以定义 | 只能在抽象类中定义 |
第8章 可扩展标记语言XML
(1)为什么学习xml
你的公司用Windows平台开发ASP.NET网站。当网站需要和另一个公司下Linux平台开发的JSP进行数据交互。
就是当实际工作中存在诸如此类跨平台、跨操作系统的数据交互问题。可以通过xml解决。
(2)什么是xml(Extensible Markup Language)?
xml称为可扩展标记性语言,是处理结构化文档信息的有力工具。
xml技术应用广泛,最基本的如网站、应用程序的配置信息一般都用xml文件描述。
Web服务使用xml定义应用程序之间传输数据的标准格式。
(3)xml语言的特点
Ø xml中的每对标记通常被称为节点,它们必须成对出现。
Ø xml中用于描述数据的各个节点可以自由扩展,也就是说xml用于描述信息的标记不是固定不变的。
Ø xml文件中的节点区分大小写。
操作xml的方法
XmlDocument myXml=new XmlDocument();
myXml.Load("Engineer.xml”);
XmlNode engineer=myXml.DocumentElement;
foreach(XmlNode node in engineer.ChildNodes)
{
switch(node.Name)
{
case‘ID’:
………………
}
}
注:XmlDocument对象表示整个XML文档,它使用Load()方法将指定的XML文件读入XmlDocument对象,Load()方法的参数是xml文档的路径。属性DocumentElement用于获取XML文件的根节点。
操作XML的对象属性和方法 | ||
对象 | 属性和方法 | 说明 |
XmlDocument | DocumentElement | 获取根节点 |
ChildNode属性 | 获取所有子节点 | |
Load()方法 | 读取整个XML的结构 | |
XmlNode | InnerText属性 | 当前节点的值 |
Name属性 | 当前节点的名称 | |
ChildNode属性 | 当前节点的所有子节点 |
第9章 文件操作
(1)读写一个文件的基本5个步骤
1、创建文件流
2、创建阅读器或着写入器
3、执行读写操作。
4、关闭阅读器或者写入器。
5、关闭文件流。
(2)文件流
流是一个用于数据传输的对象。
语法:
FileStream文件流对象=new FileStream(string filePath,File fileMode);
其中,filePath是用于指定要操作的文件,而fileMode指定打开文件的模式。
(3)文件读写器
1、StreamWriter写入器。
主要方法:
StreamWriter.Write();
StreamWriteLine();
StreamWriter.Close();
2、StreamReader读取器。
主要方法:
StreamReader.ReaderLine();
StreamReader.ReadToEnd(); //从当前位置读到末尾,返回字符串。
StreamReader.Close();
(4)Encoding解决乱码的问题
不同文件的编码格式可能会有问题。
Encoding类指定字符编码。
(5)文件和目录操作
File类的常用方法 | ||
返回值类型 | 方法名称 | 说明 |
bool | Exists(string path) | 用于检查指定文件是否存在 |
void | Copy(string oldPath,string newPath) | 执行复制操作 |
void | Move(string oldPath,string newPath) | 执行剪切操作 |
void | Delete(string path) | 删除指定的文件 |
Directory类的常用方法 | ||
返回值类型 | 方法名称 | 说明 |
bool | Exists(string path) | 用于检查指定文件是否存在 |
void | Move(string oldPath,string newPath) | 执行剪切操作 |
void | Delete(string path,bool recursive) | 删除指定目录,如果recursive值为true,则删除子目录中的所有内容。 |
(6)静态类和静态的方法
静态类与非静态类的区别 | |
静态类 | 非静态类 |
用static修饰 | 不用static修饰 |
只包含静态成员 | 可以包含静态成员 |
不可以包含实例成员 | 可以包含示例成员 |
使用类名调用静态成员 | 使用实例对象调用非静态成员 |
不能被实例化 | 可以被实例化 |
不能包含示例构造函数 | 包含示例构造函数 |
(7)FileInfo类和Directory类
FileInfo类与File类功能类似,也可以完成对文件的基本操作。不同的是File类不可以实例化对象。如果打算多次重用某个文件对象,可以考虑使用FileInfo类。
Driectory和DriectoryInfo功能非常相似。如果打算多次重用某个目录对象,可以考虑使用DirectoryInfo类的示例方法。