第一章.NET框架简介
网页的发展包括
CGI
、脚本语言、组件技术
三个阶段
.NET
框架由以下五部分组成
1、
程序设计语言及公共语言规范(
CLS
)
2、
应用程序平台
(ASP.ENT
及
Windows)
3、
ADO.NET
及类库
4、
公共语言运行库
(CLR)
5、
程序开发环境(
VS2005
)
6、
.NET
框架中包含一个庞大的类库,为了便于调用,将其中的类按照
命名空间
进行逻辑分区。
静态网页文件的后缀名是
html
在
.NET
中
CLS
的作用是
定义一种语言规范
。
HTML
简介
水平线标记
的
align
属性默认是
center
。
Html
标记一般必需是成对出现的,当然也有例外。如
、
C#基础
2010-05-23
星期日
2:14:42.34
环境变量的配置路径:
C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727
Main()
方法要么没有返回值,要么返回一个
int
。
Console.WriteLint()
等待用户按下回车键后退出程序,
Console.ReadKey()
等待用户按下任意键后退出程序。
局部变量
:局部意味着是在一个方法内部声明变量。
Read(),ReadLine(),Write(),WriteLine()的区别
Read()方法读取一个字符,ReadLine()读取字符串,Write()将字符一个一个输出,WriteLine()将字符串输出并换行。
变量与常量
变量是类或结构中的字段,如果没有初始化,默认值是
0
。
方法的局部变量必须在代码中显示初始化。
类型级变量看成是字段,方法中声明的变量看成是局部变量。
常量总是静态的,但是不能在申明常量中包含修饰符
static
。
值类型与引用类型
值类型
(
简单类型、枚举、结构
)
直接存储其值,并储存在堆栈中,引用类型(类、接口、
字符串
、数组、委托)存储其对值的引用,并存储在托管堆中,为
null
则表示未引用任何对象。
C#
中的
char
包含
16
位
,部分原因是不允许其与
8
位
byte
型之间隐式转换。
ASCII
编码是
Unicode
编码的子集。
预定义引用类型:
object
和
string
String
虽是一个引用类型,但其与其它的引用类型在常见的操作上有一些区别。如修改其中一个字符串,就会创建一个全新的
string
,而另一个字符串没有改变。
2010-05-24
星期一
所有的接口都是
public
型的。
所有私有字段都应该是
camel
大小写形式,成员字段名常用一个下划线开头。
传递给方法的所有参数都是
camel
大小写形式。
参数在传递给方法之前,无论是按值传递还是按引用传递,都必须初始化变量。
装箱和拆箱
装箱是将值类型转换为引用类型。
拆箱是将引用类型转换为值类型。
静态构造器
2010-05-25
星期二
静态构造函数不能有参数,不能有修饰符(永远是私有的)而且不能被调用,当类被加载时,类的静态构造函数自动被调用。
在一个程序执行过程中,静态构造器最多只执行一次。
静态构造器在类的静态成员初始化之后执行。
静态构造器在任何类的
静态成员被引用
之前执行,任何类的
实例变量被分配
之前执行。
析构函数
2010-05-26
星期三
一个类只有一个析构器。
析构器不能被继承或重载。
析构器不能被调用,他们是被自动调用的。
析构器不能带修饰或参数。
哪些情况会导致
Finalize
方法的调用
第
0
代对象充满
代码显示的调用
System.GC.Collect
方法
Windows
报告内存空间不足
CLR
卸载应用程序域
CLR
被关闭
2010-05-27
星期四
继承与组成的关系:继承是
is A
的关系
组成是
has A
的关系
属性与字段(变量)的比较
属性为逻辑字段
属性是字段的扩展
与字段不一样,属性不直接对应存储位置
方法的重载不能靠返回值来实现
使用
private
和
protected
实现数据封装
2010-05-28
星期五
多态
—
用抽象类和抽象方法实现
常量只能通过类名来访问
抽象方法是一个没有方法体
(
方法名括号后直接跟一个分号结束
)
的方法,用关键字
abstract
来修饰。
语法:
<
访问修饰符
> abstract
返回类型
方法名
(
<
参数
>
)
;
抽象方法没有大括号,子类没有重写抽象方法,就会报错。
含有抽象方法的类被称为抽象类,用关键字
abstract
修饰。
语法:
<
访问修饰符
> abstract class
类名
抽象类中并不一定都是抽象方法,抽象类中也可以容纳具体实现的方法。
在子类中通过
override
重写方法,语法:
<
访问修饰符
> overridet
返回类型
方法名
(
<
参数
>
)
{}
多态
—
用虚方法实现
用
virtual
修饰的方法为虚方法,虚方法可以有具体的实现,也可以被重写。
语法:
<
访问修饰符
>virtual
返回类型
方法名
(
<
参数
>
)
{
//
方法体
}
面向对象的三个特性:继承、封装、多态。
封装:保证自身数据的完整性、安全性。
继承:建立类之间的关系,实现代码重用,方便系统扩展。
多态:相同的方法调用,可以实现不同实现方式。
C#
接口中可以包含属性、方法和索引器,但是不能包含字段,并且属性和方法都不能实现,接口比抽象类更加抽象。
强制类型转换是同过“()”来实现的,如果转换失败,就会引发异常。
as
用于对象之间的转换。
New
用于覆盖父类成员。语法:【访问属性】
new
成员名称
委托
委托是函数的指针;
通过传递函数地址指针来对函数进行引用;
委托是一个类,实例化时要提供一个函数名来作为构造函数的参数;
委托有签名,也就是它的返回值类型和参数类型以及参数个数;
引用的函数必须与委托具有相同的函数签名;
委托使用分三步:声明、实例化、调用。
委托成为了两个不同线程的桥梁。不可以通过子线程来操作主线程。
调用委托与调用方法类似,唯一的区别在于不是调用委托的实现而是调用委托关联的方法的实现。
委托在语法上总是带有一个参数的构造函数,这个参数就是委托引用的方法,这个方法必须匹配最初定义委托时的签名。
委托如何和方法关联起来呢?
委托和方法的返回值类型、参数类型、参数个书相同时,就可以关联在一起了。
声明委托——实例化委托——调用委托
New
和
override
的区别
它们都是将子类的对象赋值给父类,然后通过父类来调用子类的方法。当父类和子类中的方法名相同时,如果是用
new
关键字,则父类调用的是父类的方法,如果是用的
override
关键字则调用的是子类的方法。
事件的定义
语法:【访问修饰符】
event
委托名
事件名;
事件是委托的的一个实例;
事件通过Event关键字来声明;
通过+=符号在委托中注册事件形成委托链;
委托链中的事件或方法按顺序执行;
通过-=符号在委托链中注销事件或方法的引用。
事件使“事件驱动”处理模型得以实现
事件是委托(Delegate),但委托不是事件。委托可以理解为函数的别名。
参数数组
—
可变参数
方法中形式参数的类型
值参数、引用参数、输出参数、参数数组
一种新类型的参数:参数数组
可以使用个数不定的参数调用函数
必须是参数定义中的最后一个参数
用关键字
params
说明;
params
参数必须是一维数组
引用参数和输出参数的不同在于引用参数在使用前必须先赋值。
索引器
索引器定义:访问修饰符
返回值类型
this[
索引参数
]
举例:
Public int this[int index]
{
get {return this.arr[index];}
set {arr[index]=value;}
}
索引器的定义:索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取。(有参属性)
c#中的类成员可以是任意类型,包括数组或集合。当一个类包含了数组或集合成员时,索引器将大大简化对数组或集合成员的存取操作。
泛型
泛型是通过“参数化类型”来实现在同一则代码中操作多种数据类型。
首先声明这种泛型数据类型,声明时不用指定要处理的数据的类型,只讨论抽象的数据操作,如排序、查找等。泛型接口
泛型接口通常用来为泛型集合类或者表示集合元素的泛型类定义接口。对于泛型类来说,从泛型接口派生可以避免值类型的装箱和拆箱操作。
枚举
枚举是已命名的数值常量的集合,表示特定含义的数据。枚举语法定义以关键字
enum
语法:
enum
枚举名
[
基本数据类型
]
{
枚举成员
}
举例:
enum Genders
{
Boy
,
Girl
}
顺序表
顺序表是指用一块地址连续的存储空间依次储存线性表的数据元素。
File
类的所有方法都是静态的,因而无需具有文件的实例就可被调用。
单项链表
单项链表的元素间的表面物理关系是松散的。
单项链表中的每一个节点除了存储实际数据以外,还存储了下一
个节点的引用,由此实现逻辑上的关联。
单项链表的终端结点的引用为空,表示链表的结束。
单项循环链表
单项循环链表与单项链表的区别:
单项链表的终端节点的引用域为空,表示链表的结束。
单项循环链表的终结点的引用指向头节点,实际上形成环状,失去终端节点的概念。
双向链表
双向链表中除了存储实际的数据外,还存储了
2
个引用。一个是对上一个节点的引用,一个是对下一个节点的引用。
单项链表的操作
单项链表上的
追加操作
,需要从单链表的头引用开始遍历单链表,直到链表的末尾,然后在单链表的末端添加一个新结点。插入操作
单链表的
插入操作
是指在表的第
pos
个位置结点处插入一个值为
item
的新结点。
插入操作需要从单链表的头引用开始遍历,直到找到第
pos
个位置的结点。
单项链表上的插入操作,时间主要消耗在查找操作上。因为单链表的存储空间不是连续的空间,查找过程需要从头引用开始,一个结点一个结点遍历。
最好的情况:插入位置为
0
,查找
1
次
最坏的情况:插入位置为
n
,或者超出
n
,需要查找
n
次
平均移动次数是:
n/2
时间复杂度:
0(n)
单链表的删除操作与查找操作相似
单项链表与顺序表的比较
本质区别:存储方式不同
顺序表是用地址连续的存储单元顺序存储线性表中的各个数据元素,逻辑上相邻的数据元素在物理位置上也相邻
单项链表(包含所有链表)数据元素在物理位置上任意存储,靠数据节点里的引用吧数据在逻辑上关联起来
关于定位查找的效率
顺序表存储空间连续,可以直接定位,效率非常高。
单项链表(包含所有链表)存储空间不连续,不能直接定位,需要从头开始一次遍历,效率低。
关于插入和删除的效率
顺序表进行插入和删除是,需要通过移动数据元素来实现,影响了运行效率。
单项链表(包含所以链表)进行插入和删除时,需要通过改变节点的引用实现,耗费时间的操作在查找上,效率相对顺序表较高。
栈的应用
8:56 2010-6-14
栈可广泛用于解决表达式求值、进制转换、括号匹配、迷宫、递归调用等满足
"
先进后出
"
原则的问题。
数据结构中使用树形结构来表示元素间的一对多的关系。
树
树的定义是递归的,即在树的定义中又用到了树的概念,它刻画了树的固有特性,即一棵树由若干颗子树构成,而子树又由更小的若干棵子树构成。
树的表现形式
:
树形表示法、括号表示法、文氏图表示法、凹入表示法。
树的结点
:
数据元素的内容及指向其子树的分支统称为结点。
结点的度
:
在树中,结点拥有子树的个数称为结点的度。
树的度
:树内各结点的度的最大值。
层数、堂兄弟
:
从根结点开始定义,根为第一层,根的孩子为第二层。其余结点的层数为双亲结点的层数加
1.
双亲在同一层上的结点互为堂兄弟。
树的深度
:树结点中的最大层数称为树的深度。
叶子或终端结点
:度为
0
的结点称为叶子或终端结点。
非终端结点或分支结点
:度不为
0
的结点。除根结点之外,分支结点也称为内部结点。
孩子、双亲
:结点的子树的根为该结点的孩子,该结点称为孩子的双亲或父亲。
兄弟
:同一个双亲的孩子称为兄弟。
祖先和子孙
:结点的祖先是从根到结点所经分支上的所有结点。反之,以某结点为根的子树中的任一结点都称为该结点的子孙。
有序树和无序树
:如果树中结点的各子树从左至右是有序的(即不能互换),则称该树为有序树,否则称为无序树。
森林
:森林为有限棵树的集合。对树而言,删去其根结点,就得到一个森林;对森林而言,加上一个结点作为根就变成一棵树。
二叉树
特点:每个结点至多有两颗子树;二叉树的子树有左右之分,其次序不能任意颠倒,即如果将其左右子树颠倒。即使树中的结点只有一颗子树,也要区分它是左子树还是右子树;二叉树有
5
种基本形态。
满二叉树
:在一棵二叉树中,如果所有分支结点都同时具有左孩子和右孩子,并且所有叶子结点都在同一层上。这种树的特点是每层上的结点数是最大结点数。
完全二叉树
:
完全二叉树只允许树的最后一层出现空结点,且最下层的叶子结点集中在树的左部。显然,一棵满二叉树必定是一棵完全二叉树,而完全二叉树未必是满二叉树。
二叉树的存储结构
-
顺序存储
把一个满二叉树自上而下、从左至右顺序编号,依次存放在数组内,可得到本图所示的结果。
设满二叉树结点在数组中的索引号为
i
,那么有如下性质。
1
、如果
i=0
,此结点为跟结点,无双亲。
2
、如果
i>0,
则其双亲结点为
(i-1)/2
。
3
、结点
i
的左孩子为
2i+1
,右孩子为
2i+2
。
4
、如果
i>0,
当
i
为奇数时,它是双亲结点的左孩子,它的兄弟为
i+1
;当
i
为偶数时,它是双亲结点的右孩子,它的兄弟为
n-1
;
5
、一个深度为
K
的二叉树需要
2^k-1
个存储空间。
二叉树的存储结构
-
链式存储
二叉树的链式存储结构为二叉链表的形式。
二叉链表中,每个结点除了存储本身的数据外,还应该设置两个引用域
left
和
right
,它们分别指向左孩子和右孩子。
先序遍历过程
1
、访问根结点
2
、先序遍历左子树
3
、先序变量右子树
T-SQL
语言
等于:
=
不等于:
<>
通配符:
‘—’:一个字符
%
:任意长度
[]
:指定范围内
[^]
:不在括号中