深入.NET
第一章:深入.NET框架
1.1:MIcorsoft.NET框架概述
特点:
.Net框架是开发.NET的程序核心基础,提供了一个面向对象的编程环境,完全支持面向对象编程,提高了软件的复用性和扩展性,可维护性,灵活
1.2:.NET框架体系结构
1.2.1:.NET框架的主要组件
他具有两个主要的组件:ClR和FCL。ClR是.NET的基础,FCL是综合性面向对象 的可重用的类型集合。
1.2.2:CLR介绍
CLR称为公共语言运行时,他是所有.NET运行的环境,是所有应用程序的编程基础,CLR包括两个组成部分:ClS(公共语言规范)和CTS(通用类型系统)
- .NET编译技术
为了实现夸语言开发和跨平台开发目标,.NET所有编写的应用都不变异成本的代码,而是编译成微软中间代码,将JIT编译器转换成机器代码,然后再编译成MSIl,,再通过JIT编译器编译成相应的平台专用代码。
- CTS
C#和VB都是CLR的托管代码,他们的语法和数据类型都不同CTS(通用类型系统)解决不同的语言数据类型的不同问题。
- CLS
编程语言的区别不仅在于类型,语法或者语言规范也有很多不同,因此.NET通过定义公共语言规范,限制不同点引发的操作性问题。
1.2.3:FCL
.NET另外一个重要的组成部分是FCL,就是框架类库
1.3:面向对象回顾
1.3.1:类和对象
概念:类是对象的模型,对象是类的实例
属性:我么通过GET,Set访问器来进行设置,保障类的数据安全(快捷键:prop+两次tab)
set:只写属性:只包含Set访问器
get:只读属性:只包含get访问器
get,set:读写属性:同时包含两个访问器
1.3.2:封装
优点:
保障数据的安全
提供清晰的对外接口
类内部实现可以任意修改,不影响其他类
1.3.3:类图
可以将类属性和方法以图的形式展现出来,使阅读者能够清晰的了解类之间的关系
第二章:深入C#数据类型
2.1:值类型和引用类型
2.1.1:概述
数据类型
常用的数据类型 |
java |
C# |
整形 |
int |
int |
浮点型 |
float |
float |
双精度型 |
double |
double |
字符串 |
String |
string |
布尔类型 |
boolean |
bool |
枚举类型 |
enum |
enum |
1:值类型
值类型都有一个独立的区域用于保存自己的值,值类型索在的内存区是栈(struck)只要在代码中修改就会在内存区域白菜这也值,值类型一般是基本数据类型和枚举类型
2:引用数据类型
一般包括数组,类(对象)和接口,(涉及到new对象了,基本都是引用数据类型)存在于堆中
类别 |
描述 |
|
值类型 |
基本数据类型 |
int |
Long |
||
float double |
||
char |
||
Bool |
||
枚举类型 |
Enum |
|
结构类型 |
Struct |
|
引用类型 |
类 |
基类System.Object(对象) |
string |
||
class |
||
接口 |
Interface |
|
数组 |
Int[] string[] |
2.1.1:结构
定义语法:访问修饰符 struct 结构名
{
//结构体
}
1结构的特点:
结构中可以有字段,也可以有方法
定义结构时,结构的字段不能被复初始值
2:结构的使用:
可以不用new对象,直接使用定义的对象就可以了;
声明结构对象时后,必须给结构成员复值才能使用
2.1.4:装箱和拆箱
装箱;把值类型转化成引用类型
拆箱:把引用类型转化成值类型
2.2:不同类型的参数传递
2.2.2:值方式参数传递
在值方式(没有ref修饰)参数传递时,参数可以是引用类型(会绝对的改变原版),也可以是值类型(只能改变副本,不能改变原版),
2.2.3:引用方式参数传递
在引用方式(ref修饰)参数传递时,参数可以是引用类型(会绝对的改变原版),也可以是
值类型(会绝对的改变原版),也就是说有ref修饰的传递时,无论什么类型都可以绝对的修改
第三章:使用集合组织相关数据
3.1:集合概述
集合:相当于一个可以动态维护的数组 存在于System.Collections命名空间下
3.1.1:ArrayList
属性名称 |
说明 |
|
Count |
获取集合中的元素个数(相 当于数组的length) |
|
返回值类型 |
方法名称 |
说明 |
Int |
Add(object value) |
将对象添加到集合中 |
Void |
RemoveAt(int index) |
移除集合中指定下表的元素 |
Void |
Remove(object Value) |
从集合中移除指定的元素/对象 |
Void |
Clrar() |
清除集合所有元素 |
例子(初始化器):ArrayList en=new ArrayList(){
New SE(){Name=”李四”Age=23,ID=”1001”},
New SE(){Name=”wangwu”Age=23,ID=”1002”},
New SE(){Name=”李四”Age=23,ID=”1003”}
};
ArrayList list=new ArrayList();
SE se=new SE();
se.Name=”王超”;
se.Id=”1003”;
se.Age=22;
list..Add(se); //添加元素
3.1.2:HashTable
属性名称 |
说明 |
|
Count |
获取集合中的元素个数(相当于数组的length) |
|
Keys(key) |
获取包含在集合中的keys值的集合(key获得单个元素) |
|
Values(value) |
获取包含在集合中的元素/值的集合(value获取单个元素) |
|
返回值类型 |
方法名称 |
说明 |
Int |
Add(object Ksy,object value) |
将对象(指定的key值和元素value)添加到集合中 |
Void |
Remove(object key) |
从集合中移除指定的元素/对象 |
Void |
Clrar() |
清除集合所有元素 |
例子(初始化器):HashTable en=new HashTable (){
New SE(){Name=”李四”,Age=23,ID=”1001”},
New SE(){Name=”wangwu”,Age=23,ID=”1002”},
New SE(){Name=”李四”,Age=23,ID=”1003”}
};
HashTable list=new HashTable ();
SE se=new SE();
se.Name=”王超”;
se.Id=”1003”;
se.Age=22;
list..Add(se); //添加元素
list[“key值”] 返回单个元素
foreach( object ob in list.Keys){
console.write((string)ob) //获得元素key值
}
foreach( object ob in list.values){
console.write((SE)ob) //获得元素key值
}
3.2:泛型和泛型集合
特点:可以约束元素的类型,,保障数据的安全性,常用的有:list<T> dictionary< k,V>
List<> 对象名=new List<>(); 添加元素的时候会严格控制类型(因为声明的时候在尖括号指明类型) 其他用法和Arraylist一样
Dictionary<K,v> 对象名=new Dictionary<K,v>();
Dictionary<string,SE> 对象名=new Dictionary<string,SE>();
遍历:
Foreach(KeyValuePair<string,SE> en in list){
List.Key; //获取key值
List.value; //获取Vaulue元素值
}
3.2.4:泛型类
对于一些常常处理不同的数据类型的时候,使用泛型类,大大提高了代码的复用性。
语法:
Public class类名<T>{
//
}
T:指的是类型参数,可以是自定义类型,也可以是基本类型
第四章:深入类的方法
4.1:构造函数
1:构造函数特点
方法名与类名一样
没有返回值类型
主要完成对象的初始化工作
注意:如果自定义了构造函数,系统不会默认的提供隐形的构造函数了,需要自己手动添加一个无参的构造函数,来方便其他类实例化对象(如果没有那个无惨构造函数,就不能实例化)
无参构造方法:语法
Public 类名()
{
//方法体
}
带参构造方法:语法
Public 类名(类型 变量)
{
//方法体
}
4.2:方法的重载
4.2.1:方法函数的重载
特点:
方法名相同
方法的参数类型或列表不同
在同一个类中
4.3:对象的交互
在面向对象的世界里,万物皆对象,对象是相互独立的,互不干涉,但是在一定的外力作用下对象可以实现交互。
每个类都有自己的特征和行为,我们把他们封装成属性和方法,对象之间通过属性和方法进行交流,可以认为方法的参数为对象之间交互传递消息
第六章:初识继承和多态
6.1:继承概述
6.1.1:什么是继承
1:继承就是继承父类所拥有的属性和方法,(拥有父类的特性)
语法:访问修饰符 class 类名:父类名
{
//
}
6.1.2:base关键词和producted关键词
Base:通过base.属性或方法是访问父类的属性或者方法
Producted:受保护的,只有其之类或者本类可以访问此关键词修饰的语句
修饰符 |
类的内部 |
子类 |
其他类 |
Public |
可以 |
可以 |
可以 |
Producted |
可以 |
可以 |
不行 |
Private |
可以 |
不行 |
不行 |
Internal |
可以 |
不可以 |
可以 |
6.1.3:子类构造函数
1:隐式调用父类的构造函数
在创建子类对象的时候,会默认的先调用父类的无参构造函数,在调用本类的构造函数。如果是没有无惨构造函数,就要指定一个带参构造函数,如果自己写了构造函数,就不会提供默认的无参构造函数。
2:显示调用父类构造函数
可以用base关键词显示的调用父类的构造函数。只要在之类的构造函数添加 :base(参数
列表),就可以指定该子类的的构造函数调用父类的那一个构造函数。这样便可以实现继承属性初始化。然后在子类本身的构造函数中完成对子类特有的属性的初始化即可。
6.2:继承的应用
6.2.1:继承的特性
1:继承的传递性
子类 可以继承 父类 的特性,子类 的 子类 可以继承 子类 的特性
2:继承的单根性
子类不能继承多个父类,(不能实现多继承)
6.2.2:is a的 应用
就是 x is a y:就是指:x属于y的类型。就可以转换为y类,实现强制转换
6.3:多态
虚方法实现多态:父类定义一个虚方法,子类重写父类的方法。,然后执行的时候会执行子类的重写方法。就可以实现多态。
语法:
父类: public virtual 返回值类型 方法名()
{
//方法名要一样,不同的子父类中
}
子类: public override 返回值类型 方法名()
{
////方法名要一样,不同的子父类中
}
第七章:深入理解多态
7.1:里氏替换和多态
7.1.1:里氏替换的概述
1:就是子类替换父类可以出现在任何位置。但是父类不能替换子类。(子类可以替换父类,单父类不能替换子类),就是可以先申明一个父类,然后new 一个子类对象
2:is 和as 操作符的使用
If(X is y){
X as y
}
就是如果x是y类型,就把x转换为y类型
7.1.2:父类类型作为参数
里氏替换原则指子类对象可以替换父类对象。那么开发程序可以编写一父类作为形参数,然后实际传入子类对象。从而实现多态。
7.2:抽象类和抽象方法
7.2.1:为什么使用抽象类和抽象方法
语法:访问修饰符 abstract 返回值类型 方法名(); //抽象方法没有逻辑代码块
语法: 访问修饰符 abstrauct class 类名{
//
}
抽象类不能实例化。
抽象类中不一定都是抽象方法。但是抽象类也可以容纳具体的实例方法。但是:抽象方法的类必须是抽象类。
7.2.2:抽象类和抽象方法的应用
1:如何实现抽象方法
档重一个子类派生一个父类,子类将继承父类的所有特征。包括它为实现的抽象方法。抽象方法必须在其子类实现。除非它的子类也是抽象类。与子类重写父类虚方法。在子类也使用override关键词来重写抽象方法。
第八章:可扩展标记语言XML
8.1:XML概述
8.1.1:为什么学习XML
解决跨平台,夸操作系统的数据交互问题。
8.1.2:什么是XML
XML称为可扩展标记语言。可以实现不同的系统之间的数据交互。
XML中的每队标记通常被称为节点、必须成对出现。用来描述这个节点的内容。在节点中存储该节点的信息
XML中用于描述数据各个节点可以自由扩展,不是固定的节点,可以自定义。
XML文件中的节点是区分大小写的。
8.2:操作XML的方法
8.2.1:解析XML文件
XMLDocment myXml= new XmlDocment();
myXml.Load(“文件名路径”);
XmlLNode engineer=myXml.DocuMentEleMent; //上面几步可以读取到XMl的根节点
Foreach(XmlNode node in engineer.ChildNodes)
{
//node.InnerText; //获取到节点的内容
//node.name; //获取到节点的节点名
对象 |
属性和方法 |
说明 |
XmlDocument |
DocumentElement属性 |
获取节点名 |
ChildNodes |
获取所有子节点 |
|
Load() |
读取整个XMl文件 |
|
XmlNode |
InnerText |
当前节点的值 |
Name属性 |
当前节点的名称 |
|
ChiidNodes |
当前节点的所有子节点 |
}
8.3:用TreeView显示数据
8.3.2:动态绑定TreeView数据
给TreeView添加节点用Add()方法
TreeNode Root=new TreeNode(“string类型的参数”);
This.tvMenu.Add(Root);
Add()方法的参数可以是文本 , 返回值是当前节点对象
TvMenu.Node.add(“string类型参数”);
给选择的节点添加子节点
This.tvMenu.seleedNode.Nodes.Add(“新闻频道”);
属性 |
说明 |
Nodes |
TreeView中的所有数节点 |
selectedNode |
选择的节点 |
事件 |
说明 |
AfterSelect |
选择节点发生的事件 |
属性 |
说明 |
Text |
节点的文本 |
Index |
节点所有集合索引 |
Level |
节点的深度 |
Tag |
节点的隐藏值 |
Nodes |
节点的所有下一集节点 |
2:TreeView动态删除节点
删除选择节点
This.TvMenu.selectedNode.Remove();
清空选择的节点的子节点
This.TVMenu.SelectedNode.Nodes.Clear();
清空所有的子节点
This.tvMenu.nodes.Clear();
第九章:文件操作
9.1:文件概述
用来保存临时的较少的数据的。
9.2:如何读取文件
(导入命名空间:using System IO;)
步骤:
创建文件流
创建读取器或者写入器
执行读/写操作
关闭读取器或者写入器
关闭文件流
语法:
FileSrtream mySf= new FIleStream(path,FileMode.Create); ///path:路径参数 ,FileMode:枚举类型
StreamWriter mySw= new StreamWriter(mySf,Enconding.UTF-8); 或者 读取
StreamReader mySr= new StreamReader (mySf,Enconding.UTF-8);
MySw/mySr.write/Reader(“写入的内容参数”/读取的内容参数);
mySw/mySr.close();
mySf.close();
StreamReader读取器:
StreamReader主要用于读取流中的数据
StreamReader.ReadLine(); 读取一行数据 ,返回字符串
StreamReader.ReadTOEnd(); 从当前位置读取到结束的位置
StreamReader.Close(); 关闭读取器
9.3:文件和目录操作
9.3.1:File类和Directory类
File(文件类)类的常用方法
返回值类型 |
方法名称 |
说明 |
Bool |
Exists(stirng path) |
用于检查指定的文件是否存在 |
Void |
Copy(string sourcepath,nowPath) |
将指定路径的文件复制到其他路径去 |
Void |
Move(string sourcepath,nowPath) |
将指定文件移动到新路径 |
Void |
Delete(string path) |
删除指定的文件 |
Directory目录类
返回值类型 |
方法名称 |
说明 |
Bool |
Exists(string path) |
检查是否存在此目录(文件夹) |
Void |
Move(string sourcepath,nowPath) |
将指定目录移动到新路径 |
Void |
Delete(string path) |
删除指定的目录 |
静态类与非静态类的区别
静态类 |
非静态类 |
Static修饰 |
不能Static修饰 |
只包含静态成员 |
刻意包含静态成员 |
不能包含实例成员 |
可以包含实例成员 |
使用类名调用静态属性 |
使用实例对象调用非静态的属性 |
不能被实例化 |
可以被实例化 |
不能包含实例构造函数 |
包含实例构造函数 |
语法:class 类名
{
Public static 数据类型 变量名;
Public static 返回的数据类型 方法名()
{
//
}
}
9.3.3:提供实例方法的文件和目录操作
FileInfo类和File功能类似(只不过前者要实例化,后者不用背实例化就可以用了)
FileInfo类
属性 |
说明 |
Exists |
检查文件是否存在 |
Extension |
获取文件的扩展名的字符串 |
Name |
获取文件名 |
FullName |
获取文件的完整目录(绝对路径) |
CopyTo(string) 返回:FileInfo类型 |
将现有的文件复制到新的指定为地方 |
Delete() void |
删除指定的文件 |
MoveTo(); void |
吧此文件移动到指定的一个新的路径位置 |
DirectoryInfo类
与directory类型类似
用法步骤:
DirectoryInfo di= new DirectoryInfo(“指定的路径”); //创建目录读取的对象
DirectoryInfo[] subDir=di.GetDirectories; //返回当前的目录的子目录数组
FileInfo[] fi= new GetFiles(); //返回当前目录文件的列表(返回当前目录下的文件)