有关C#的概念总结
这篇文章为大家带来有关C#中的概念详细介绍。大部分知识点都是大家经常用到的,为此分享给大家做个参考。一起跟随小编过来看看吧。
1.什么是.Net
.Net是由Microsoft推出的应用程序开发平台,可用来构建和运行新一代Microsoft Windows和Web应用程序。
2. .Net的核心技术
.Net Framework:.Net 平台核心中的核心,为.Net 平台下的应用程序的运行提供基本框架。
.Net企业服务器:微软为企业提供技术服务的一部分,包括各种开发工具包。
构建模块服务:微软提供的COM+组件服务和XML Web服务技术,利用构建模块服务开发应用程序模块,可以迅速地组装一个功能完备的软件。
Visual Studio.Net : .Net 平台的主要开发工具
3..Net Framework由不同组件组成,用于支持创建和运行基于.NET平台的应用程序。
4..Net Framework框架的底层是Windows操作系统提供的各种应用程序服务组件,这些组件包括:消息队列服务、COM+组件服务、Internet信息服务(IIS)、Windows管理工具(WMI)等。
5..Net Framework可以与他们整合以开发应用程序,在.Net Framework最顶层是程序设计语言, .Net Framework支持20多种计算机程序设计语言。在Visual Studio.Net 开发环境中,可以直接使用VB、C#、C++、J#、Jscript这5种语言开发任何应用程序。
6..Net Framework具有两个主要组件:公共语言运行时(CLR)和.Net Framework类库,除此之外还有ADO.NET、ASP.NET、XML Web等。
7..Net Framework支持3种类型的用户界面:
命令控制台,用来设计纯字符界面的应用程序
Windows窗体,用来设计Windows界面的应用程序
Web窗体,用来设计Web界面的应用程序
8.ADO.NET是.Net Framework提供的微软新一代的面向对象的数据处理技术,利用它可以简便、快捷地开发数据库应用程序。
ASP.Net是.Net Framework提供的全新的Web应用程序开发技术,利用ASP.NET开发WEB应用程序如同开发Windows应用程序一样简单。
Xml Web Service是一种能够在Internet环境中直接调用的组件。.Net Framework提供了创建、测试和部署XML Web服务的工具和类。
9.Net Framework为应用程序开发者提供了一个与平台无关
的开发环境,使用.Net Framework开发程序有以下优点:
1. 基于Web的标准
.Net Framework完全支持现有的Internet技术和其他Web标准。
2. 使用统一的应用程序模型
任何与.NET兼容的语言都可以使用.Net Framework类库。
3. 易于开发人员使用
当开发人员需要调用.Net Framework类库的类时,只要将该类属性命名空间添加到引用解决方案中即可。
4. 可扩展类
.Net Framework提供了通用类型系统,开发人员可以通过继承来访问类库中的类,也可以扩展类库中的类,甚至于构建自己的类库。
C#的优势:(1) C# 是一种精确、简单、类型安全、面向对象的语言。
(2) C#具有生成持久系统级组件的能力。
(3) C# 利用.Net Framework的通用类型系统能够与其他程序设计语言交互操作。
(4) C#支持MSMQ(微软消息队列)服务、COM+组件服务、XML Web服务和.Net Framework 。
(5) C#允许自定义数据类型、以扩展的元数据。
(6) C#增强了开发效率,同时也保持了开发者所需要的灵活性。
C#程序的特点:4. C#程序中的方法的结构
C#程序中的一个方法由两部分组成:方法头部和方法体。
方法头部:方法的头部即方法的第1行,包括返回值类型、方法名、形参名及形参类型的说明。
方法体:方法体使用一对大括号“{ }”括起来,通常包含声明语句和执行语句。
5. C#程序的语句
C#程序中的每个语句必须以分号结尾,在书写时,可以一行书写几条语句,也可以将一条语句分写在几行上。
6. C#程序的输入与输出操作
C#语言自身没有输入、输出语句,因此C#控制台应用程序必须借助类库中的Console类的方法(ReadLine、WriteLine等)来完成输入、输出等操作,而C# Windows应用程序和Web应用程序必须借助类库的控件类(如标签、文本框等)来实现输入、输出。
7. C#程序的注释
可以用“//”或“/*……*/”添加注释。适当的添加注释,可以大大增强程序的可读性。
简单类型表示一个有唯一取值的数据类型,包括以下4种
类型:1. 整数型2. 浮点型3. 小数型4. 布尔型
float型:取值范围在±1.5e?45 到 ±3.4e38精度为7位
double型:取值范围在±5.0e?324 到 ±1.7e308精度为15到16位
3. 小数型decimal 为满足高精度的财务和金融计算领域的需要,C#提供小数型数据类型
取值范围在±1.0?×?10e?28 至 ±7.9?×?10e28精度为28到29位
4. 布尔型(bool)用来表示逻辑真或逻辑假只有两种取值:true(真)或false (假)
5.程序运行过程中,其值始终不变的量称为常量
1, 整型常量
整形常量分有符号的整型常量、无符号的整型常量和长整型常量
有符号的整型常量直接书写,如5
无符号整型常量在书写时添加u或U标志,如5U
长整型常量在书写时添加l或L标记,如5L
2. 浮点型常量
浮点型常量分单精度浮点型常量和双精度浮点型常量
单精度浮点型常量在书写时添加f或F标记,如5F
双精度型常量添加d或D标记,如5D
以小数形式直接书写时,自动被解释成双精度浮点型常量,如5.0即为双精度浮点型常量。
3. 小数型常量
小数型常量的后面必须添加m或M标记,否则就会被解释成浮点型数据。
4. 字符型常量 (Unicode字符):
字符型常量使用两个单引号来标记 ,例如’5’、 ’A’、 ’中’、 ’@’
C#的转义字符常量以反斜杠’\’开头,用来表示控制及不可见的字符,如’\b’表示倒退一个字符。详见教材P26表2-3
5. 布尔型常量
只有两个, true 表示逻辑真,false表示逻辑假。
6. 字符串常量
字符串常量表示若干个Unicode字符组成的字符序列,使用双引号来标记,例如”5”、”abc”、”中国人”。
结构型必须使用struct来标记。
结构型的成员允许包含数据成员、方法成员等
数据成员表示结构的数据项
方法成员表示对数据项的操作。
1. 变量的概念
在程序运行过程中,其值可以被改变的量称为变量。
变量名:每个变量都必须有一个名字。变量命名应遵循标识符的命名规则,如必须以字母或下划线打头,只能包含英文字母、数字、和下划线,不能包含空格等。
变量值:变量值存储在内存中;不同类型的变量,占用的内存单元(字节)数不同。在程序中,通过变量名来引用变量的值。
2. 变量的定义
变量定义的一般形式为:
数据类型 变量名1,变量名2,……;
例如:
int a,b,c; long x,y; float p1,p2;
3.变量的初始化
例如:
float f1=1.25, f2=3.6;
值类型之间的数据可以相互转换,转换的方法有两种,一种是隐式转换,另一种是显式转换。
1. 隐式转换
如果参与运算的数据类型不相同,则先转换成同一类型,然后进行运算;
转换时按数据长度增加的方向进行,以保证精度不降低,例如int型和long型运算时,先把int数据转成long型后再进行运算;
所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算;
byte型和short型数据参与运算时,必须先转换成int型;
Char型可以隐式转换为ushort、int、uint、long、ulong、float、double或decimal型,但不存在其他类型到char类型的隐式转换。
2. 显式转换
强制类型转换的一般形式为:
(类型说明符) (待转换的数据)
例如:(int)(x+y) //把x+y的值强制转换为int型
注意:上例不可写为(int)x+y,另外经过强制类型转换后x、y本身的变量类型并不会改变
3. C#还允许使用System.Convert类提供的类型转换方法来转换数据类型
常用的转换方法有ToBoolean 、ToByte、ToChar、ToInt32、ToSingle、ToString等
例如
byte x=40,y=5; //定义字节型变量x和y byte z=Convert.ToByte(x+y); //将int型值转换为byte型并赋给byte型变量z char c=Convert.ToChar(z+20); //将int型值转换为char型并赋给char型变量z
C#算术运算符包括+、-、*、/、%、++、--共七种
自增++/自减--运算符
当++或--运算符置于变量的左边时,称之为前置运算,表示先进行自增或自减运算再使用变量的值,而当++或--运算符置于变量的右边时,称之为后置运算,表示先使用变量的值再自增或自减运算
例如:设变量i=1、变量j=2,则表达式++i + j-- 的值为4
2. 复合赋值运算符
+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
1. 什么是数组
数组是一种由若干个变量组成的集合,数组中包含的变量称为数组的元素,它们具有相同的类型。
数组元素可以是任何类型,包括数组类型。
数组元素的个数称为数组的长度,数组长度为0时称数组为空数组。
数组元素没有名称,只能通过索引来访问,索引从零开始。
具有 n 个元素的数组的索引是从 0 到 n-1。
C#支持一维数组和多维数组。
2. 数组的声明和创建
C#中的数组是一个对象,所以使用new运算符来创建
声明和创建一维数组的一般形式:
数组类型[ ] 数组名 = new 数组类型[数组长度];
如:
int[ ] numbers=new int[5]; //创建具有5个元素的一维数组numbers
声明和创建多维数组的一般形式:
数组类型[逗号列表] 数组名 = new 数组类型[数组长度列表]
如:
int[,,] numbers=new int[5,4,3]; //创建一个三维数组numbers
3. 数组的初始化
(1)在创建数组时初始化
创建一维数组时初始化的一般形式为:
数组类型[ ] 数组名 = new 数组类型[数组长度]{初始值列表};
如:
int[ ] numbers=new int[ ]{1,2,3,4,5} ;//当省略数组长度时,则给出的数据个数即为数组长度
上例中numbers[0]=1,……,numbers[4]=5
在创建并初始化数组时,还可采用简写形式:
数组类型[ ] 数组名 ={初始值列表}
如
int[ ] numbers={1,2,3,4,5} ;
3. 数组的初始化
(2)在声明一维数组后初始化数组
在声明后初始化一维数组的一般形式为:
数组类型[ ] 数组名;
数组名 = new 数组类型[数组长度]{初始值列表};
如:
int[ ] numbers; numbers = new int[ ]{1,2,3,4,5} ;
注意在先声明后初始化时,不能采用简写形式,例如:
int[ ] numbers; numbers = {1,2,3,4,5} ;
是错误的
4. 数组的使用:
每个数组元素相当于一个普通变量,使用数组元素的一般形式为:
数组名[索引]
C#的数组类型是从抽象基类型System.Array派生的引用类型, System.Array类提供的Length属性可以用来获得数组的个数。
另外System.Array提供了Clear、CopyTo、Find、Resize、Sort等方法,用于清除数组元素的值、复制数组、搜索数组、更改数组长度和对数组元素排序等。
5.System.String与 System.Text.StringBuilder
C#的string 是.NET Framework中System.String 的别名,可创建不可变的字符串。其提供的常用属性和方法有Length、Copy、IndexOf、LastIndexOf、Insert、Remove、Replace、Split、Substring、Trim等,分别用来获得字符串长度、复制字符串、从左查找字符、从右查找字符、插入字符、删除字符、替换字符、分割字符串、取子字符串、压缩字符串的空白等。
System.Text.StringBuilder类用来构造可变字符串,包含Length、Append、Insert、Remove、Replace、ToString等成员,分别用来获得字符串长度、追加字符、插入字符、删除字符、替换字符和将StringBuilder转换为string字符串。
对象(Object),是问题域中某些事物的一个抽象,反映事物在系统中需要保存的必要信息和发挥的作用,是包含一些特殊属性(数据)和服务(行为方法)的封装实体。
具体来说,对象应有唯一的名称、有一系列状态(表示为数据)、有表示对象行为的一系列行为(方法),如右图所示。
对象=数据+动作(方法/操作)
1. 事件(Event)
又称消息(Message)表示向对象发出的服务请求。
2. 方法(Method)
表示对象能完成的服务或执行的操作功能。
类(Class)是具有相同属性和服务的一组对象的集合
类为属于同类的所有对象提供统一的抽象描述。其中,相同的属性是指定义形式相同,不是指属性值相同。
对象是类的一个实例。
类与实例的关系是抽象与具体的关系,类是多个实例的综合抽象,实例是类的个体实物。
面向对象的最基本的特征是封装性、继承性和多态性:
1. 封装
封装就是指把对象的全部属性和全部服务结合在一起形成一个不可分割的独立单位。
封装是一种信息隐蔽技术,用户只能见到对象封装界面上的信息,对象内部对用户是隐蔽的。
封装的目的在于将对象的使用者与设计者分开,使用者不必了解对象行为的具体实现,只需要用设计者提供的消息接口来访问该对象。
例如,各种有标准视频接口的设备都可以连接电视机。
2.继承
特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承,即在特殊类中不必重新定义已在一般类中定义过的属性和服务,这种特性在面向对象中称作对象的继承性。
继承在C#中称为派生,其中,一般类称为基类或父类,特殊类称为派生类或子类。
例如灵长类动物称为一般类,具有属性包括手和脚(其它动物没有),具有的服务是抓取东西(其它动物没有),人类作为特殊的灵长类高级动物,除了继承灵长类动物的所有属性和服务外,还具有特殊的服务(创造工具)。
继承机制的优势在于降低了软件开发的复杂性和费用,使软件系统易于扩充
3. 多态
多态性是指在基类中定义的属性或服务被派生类继承后,可以具有不同的数据类型或表现出不同的行为。
为了实现多态性,需要在派生类中更改从基类中自动继承来的数据类型或方法。
这种为了替换基类的部分内容而在派生类中重新进行定义的操作,在面向对象概念中称之为覆盖。
例如,假设机动车类是一个基类,它具有一个称为更换轮胎的方法,但是当从机动车派生火车类时,火车更话车轮的方法与一般的机动车不同,于是只能通过覆盖的方法在火车类中重新定义一个更换车轮的方法,以替换其基类的方法。
多态性的优势在于使软件开发更加方便,增加程序的可读性。
类的常量成员是一种符号常量,必须指定名称和值
访问修饰符包括:public、private、internal、protected、protected internal。
在使用访问修饰符来定义命名空间、结构和类及其成员
时,需注意:
(1)一个成员或类型只能有一个访问修饰符,使用protected internal组合时除外。
(2)命名空间上不允许使用访问修饰符,命名空间没有访问限制。
(3)如果未指定访问修饰符,则使用默认的可访问性,类成员默认为private。
(4)*类型(不嵌套在其他类型中的类型)的可访问性只能是internal或public,默认可访问性是internal。
定义方法的详细说明
(1) 访问修饰符控制方法的访问级别,可用于方法的修饰符包括:public、protected、private、internal等等。
(2) 方法的返回值类型可以是任何合法的数据类型,包括值类型和引用类型。当无返回值时,返回值类型使用void关键字来表示。
(3) 方法名必须符合C#的命名规范,与变量名命名规则相同。
(4) 参数列表是方法可以接受的输入数据。当方法不需要参数时,可省略参数列表,但不能省略圆括号。当参数不止一个时,需要使用逗号作间隔,同时每一个参数都必须声明数据类型,即使这些参数的数据类型相同也不例外。
(5) 花括号{}中的内容为方法的主体,由若干条语句组成,每一条语句都必须使用分号结尾。当方法结束时如果需要返回操作结果,则使用return语句返回,此时要注意return语句返回的值的类型要与方法返回值类型相匹配。如果方法使用void标记为无返回值的方法,可省略return语句。
1. 值类型参数
调用方向方法传递值类型参数时,调用方将把实参变量的值赋给相对应的形参变量,即实参变量和形参变量是两个不相同的变量。
实参变量的值传递给形参变量时是一种单向值传递。
引用型参数
与值参数不同,调用方向方法传递引用类型参数时,调用方将把实参变量的引用赋给相对应的形参变量。实参变量的引用代表数据值的内存地址,因此,形参变量和实参变量将指向同一个引用。
如果在方法内部更改了形参变量所引用的数据值,则同时也修改了实参变量所引用的数据值。
由于使用return语句一次只能返回一个数据,如果需要返回多个数据,则可以利用引用型参数的这个特点来实现。
C#通过ref关键字来声明引用参数,无论是形参还是实参,只要希望传递数据的引用,就必须添加ref关键字。
输出参数
方法中的return语句只能返回一个运算结果,虽然也可以使用引用型参数返回计算结果,但要求先初始化实参。
而输出参数不需要对实参进行初始化,它专门用于把方法中的数据通过形参返回给实参,但不会将实参的值传递给形参。一个方法中可允许有多个输出参数。
C#通过out关键字来声明输出参数,无论是形参还是实参,只要是输出参数,都必须添加out关键字。
数组型参数
把数组作为参数,有两种使用形式:
一种是在形参数组前不添加params修饰符
另一种是在形参数组前添加params修饰符。
两种形式的区别
不添加params修饰符时,所对应的实参必须是一个数组名。
添加params修饰符时,所对应的实参可以是数组名,也可以是数组元素值的列表。
值得注意的是,无论采用哪一种形式,形参数组都不能定义数组长度。
方法的重载
方法的重载是指在同一个类型中,以同样的名称声明两个或多个方法。当需要以不同的参数列表执行同样的操作时,方法重载将会很有用。
2. 析构函数的特点:
(1) 不能在结构中定义析构函数,只能对类使用析构函数;
(2) 一个类只能有一个析构函数;
(3) 无法继承或重载析构函数;
(4) 析构函数既没有修饰符,也没有参数;
(5) 在析构函数被调用时,.Net Framework的CLR自动添加对基类Object.Finalize方法的调用以清理现场,因此在析构函数中不能包含对Object.Finalize方法的调用。
注意,在默认情况下,编译器自动生成空的析构函数,因此C#不允许定义空的析构函数
1. 静态类的定义:
静态类使用static关键字来声明,表明它仅包含静态成员。
不能使用new关键字创建静态类的实例 。
在实际应用中,当类中的成员不与特定对象关联的时候,就可以把它创建为静态类。
2. 静态类的主要功能:
(1) 静态类仅包含静态成员;
(2) 静态类不能被实例化;
(3) 静态类是密封的;
(4) 静态类不能包含实例构造函数。
3. 静态类的优点:
(1) 编译器能够自动执行检查,以确保不添加实例成员;
(2) 静态类能够使程序的实现更简单、迅速,因为不必创建对象就能调用其方法。
注意:因为静态类是密封的,因此不可被继承。另外,静态类不能包含实例构造函数,但仍可以声明静态构造函数,以分配初始值或设置某个静态状态。
(1) 派生类的特点
可以拥有自己的成员。
可以隐式地从基类继承所有成员,包括方法、字段、属性和事件,但私有成员、构造函数和析构函数等除外。
派生类只能从一个类中继承
密封类
使用密封类可以阻止一个类的代码被其他类继承
使用密封类的好处:
可以提高应用程序的可靠性和性能(在.NET Framework公共语言运行时CLR中,加载密封类时将对密封类的方法调用进行优化)。
软件企业通过使用密封类还可以把自己的知识产权保护起来,避免他人共享代码。
在C#中,添加关键字sealed可以声明密封类。
4.为了使用派生类能更改基类的数据和行为,C#提供了两种选择:1.使用新的派生类成员替换基成员2. 重写虚拟的基成员
使用virtual和override时要注意以下几点:
(1)字段不能是虚拟的,只有方法、属性、事件和索引器才可以是虚拟的;
(2)使用virtual修饰符后,不允许再使用static、abstract或override修饰符;
(3)派生类对象即使被强制转换为基类对象,所引用的仍然是派生类的成员;
(4)派生类可以通过密封来停止虚拟继承,此时派生类的成员使用sealed override声明。
抽象类的特点:
抽象类是用来作为基类的,不能直接实例化,而且只能使用abstract关键字来标识。抽象类的用途是提供多个派生类可共享的基类的公共定义。
抽象类可以包含抽象的成员,如抽象属性和抽象方法,也可以包含非抽象的成员,甚至还可以包含虚方法。
抽象属性的特点
类的属性成员添加了abstract关键字后,就成了抽象属性。
抽象属性声明不提供属性访问器的实现,它只声明该类支持的属性,而将访问器的实现留给派生类。
抽象属性同样可以是只读的、只写的或可读写的属性。
当派生类从抽象类中继承一个抽象属性时,派生类必须重载该抽象属性。
抽象属性使用abstract关键字来标识
抽象方法的特点:
类的方法成员添加abstract关键字后,就成为抽象方法。
抽象方法声明不提供方法的实现,它必须是一个空方法,而将方法实现留给派生类。
当派生类从抽象类中继承一个抽象方法时,派生类必须重载该抽象方法。
由于抽象方法没有实现,因此,抽象方法不包含常规的方法体,以分号结尾。
1.委托(delegate)是一种引用方法的类型,它与类、接口和数组相同,属于引用型。
在C#程序中,可以声明委托类型、定义委托类型的变量、把方法分配给委托变量,还可以通过委托来间接地调用一个或多个方法。
一旦为委托分配了方法,委托将与该方法具有完全相同的行为。
C#允许把任何具有相同签名(相同的返回值和参数)的方法分配给委托变量。
委托的实质是代表方法的引用(即内存地址),是定义回调方法的理想选择,也是C#实现事件驱动的编程模型的主要途径。
委托具有以下特点:
(1)委托类似于 C++ 函数指针,是完全面向对象的,是安全的数据类型。
(2)委托允许将方法作为参数进行传递。
(3)委托可用于定义回调方法。
(4)委托可以链接在一起。例如,可以对一个事件调用多个方法。
(5)委托签名不需要与方法精确匹配。
集合是通过高度结构化的方式存储任意对象的类,与无法动态调整大小的数组相比,集合不仅能随意调整大小,而且对存储或检索存储在其中的对象提供了更高级的方法。
集合可以把一组类似的类型化对象组合在一起。
选择集合类时,一般要考虑以下问题:
(1)是否需要一个序列列表,需要先进先出行为时可使用 Queue 队列类,在需要后进先出行为时可使用 Stack栈类。
(2)是否需要随机访问集合中的元素,此时不能选择Queue 队列类、Stack栈类、LinkedList 双向链表类。
(3)是否需要通过索引访问每个元素,只有ArrayList动态数组类、StringCollection字符串集合类等是从索引为零的元素开始逐个访问集合元素。Hashtable哈希表、Dictionary字典类通过元素的键(即元素名字)提供对元素的访问。而NameValueCollection 类和SortedList 泛型类通过其元素的从零开始的索引,或者通过其元素的键提供对元素的访问。
(4)是否包含一个值、一个键和一个值的集合,还是一个键和多个值的集合。其中,“一个值”的集合是一种基于 IList 列表接口派生的集合,“一个键和一个值”的集合是一种基于IDictionary字典接口的集合,“一个键和多个值”的集合是 NameValueCollection 类。
(5)是否需要用与输入元素方式不同的方式对元素排序。Hashtable 哈希表类按其元素的哈希代码对元素排序,SortedList有序表类以及 SortedDictionary有序字典根据 IComparer 可比较接口来实现按键对元素的排序,而ArrayList动态数组类提供 Sort 排序方法。
(6)是否需要信息的快速搜索和检索,对于小集合(10个元素或更少),ListDictionary 比 Hashtable 快,SortedDictionary 泛型类提供比 Dictionary 泛型类更快的查找。
(7)是否需要只接受字符串的集合,如使用StringCollection和 StringDictionary等。
动态数组类ArrayList不限制元素的个数和数据类型。
(1) ArrayList与Array的区别
Array 的大小是固定的,而 ArrayList的大小可根据需要自动扩充;
在Array中一次只能获取或设置一个元素的值,而在ArrayList中允许添加、插入或移除某一范围的元素;
Array 的下限可以自定义,而ArrayList的下限始终为零;
Array 可以具有多个维度,而 ArrayList始终只是一维的;
Array 位于 System 命名空间中,ArrayList 位于 System.Collections 命名空间中。
(2) 创建动态数组:
ArrayList 列表对象名 = new ArrayList(?);
队列的特点
一种先进先出的数据结构,当插入或删除对象时,对象从队列的一端插入,从另外一端移除
创建队列对象
Queue 队列名 = new Queue([队列长度][,增长因子]);
说明,队列长度默认为32,增长因子默认为2.0(即每当队列容量不足时,队列长度调整为原来的2倍)
注意,由于调整队列的大小需要付出一定的性能代价,因此建议在构造队列时指定队列的长度。
常用队列操作方法包括Enqueue向队尾添加数据、Dequeue移除队头数据、Peek返回队头数据、Clear清空队列和Contains检查是否包含某个数据等。其中,Enqueue和Dequeue每操作一次只能添加或删除一个数据。
栈的特点:
一种先进后出的数据结构,这种数据结构在插入或删除对象时,只能在栈顶插入或删除。
创建栈对象:
Stack 栈名 = new Stack(?);
栈常用方法包括Push在栈顶添加数据、Pop移除栈顶数据、Peek返回栈顶数据、Clear清空栈和Contain检查是否包含某个数据等。其中,Push和Pop每操作一次只能添加或删除一个数据。
哈希表又称散列表,表示键/值对的集合。
哈希表的特点:在保存集合元素时,首先要根据键自动计算哈希代码,以确定该元素的保存位置,再把元素的值放入相应位置所指向的存储桶中。查找时,再次通过键所对应的哈希代码到特定存储桶中搜索。这样可以大大减少为查找一个元素进行的比较次数。
创建哈希表对象
Hashtable 哈希表名 = new Hashtable([哈希表长度][,增长因子]);
说明,默认长度为0,默认增长因子为1.0
哈希表常用操作方法包括Add添加数据、Remove移除数据、Clear清空哈希表和Contains检查是否包含某个数据等。其中, Add方法需要两个参数,一个是键,一个是值;Remove方法只需要一个键名参数。
接口索引器与类索引器的区别有两个:
一是接口索引器不使用修饰符;
二是接口索引器只包含访问器get或set,没有实现语句。
创建自定义的泛型类时,需要特别注意以下事项:
(1)将哪些类型通用化为类型参数
一般规则是:能够参数化的类型越多,代码就会变得越灵活,重用性就越好,但太多的通用化会使其他开发人员难以阅读或理解代码。
(2)如果存在约束,应对类型参数应用什么约束
一般规则是:应用尽可能最多的约束,但仍能够处理需要处理的类型。例如,如果知道泛型类仅用于引用类型,则应用类约束。这可以防止泛型类被意外地用于值类型。
(3)是否将泛型行为分解为基类和子类
由于泛型类可以作为基类使用,其注意事项与非泛型类相同。
(4)是否实现一个或多个泛型接口。
事件处理系统的构成要素
(1) 事件源:指能触发事件的对象,有时又称为事件的发送者或事件的发布者;
(2) 侦听器:指能接收到事件消息的对象,Windows提供了基础的事件侦听服务;
(3) 事件处理程序:当事件发生时对事件进行处理,又称事件函数或事件方法,包含事件处理程序的对象称为事件的接收者,又称事件的订阅者。
C#中的事件具有以下特点:
(1) 事件是类用来通知对象需要执行某种操作的方式;
(2) 尽管事件在其他时候(如信号状态更改)也很有用,但通常还是用在图形用户界面中;
(3) 事件通常使用委托事件处理程序进行声明;
(4) 事件可以调用匿名方法来替代委托。
1. 事件的基本概念
触发事件的对象称为发布者,提供事件处理程序的对象称为订阅者。在.NET Framework中,基于事件驱动的程序使用委托来绑定事件和事件函数,在C#中,事件实际上就是一个委托类型的变量。
C#允许使用内置的EventHandler委托类型来声明一个标准的事件,也允许先自定义委托,再声明自定义事件。
在.NET Framework中,内置的EventHandler委托具有两个参数,它们的数据类型分别是Object和EventArgs类型,并且没有返回值。
Object参数名通常为sender,表示事件发布者本身;EventArgs参数通常为e,它将System.EventArgs类的新实例传递给事件函数。在实际编程中,有时需要从EventArgs类派生自定义事件参数类,这样发布者可以将特定的数据发送给接收者的事件函数。
事件的声明
(1) 使用内置的EventHandler委托声明事件的形式(标准事件)
格式:public event EventHandler 事件名;
其中,事件名通常使用on作为前缀符。
例如,public event EventHandler onClick;
(2) 使用自定义的委托类型声明事件
格式:public delegate 返回值类型 委托类型名([参数]);
public event 委托类型名 事件名;
其中,委托类型的参数非常灵活,可以省略,可以是标准的Object参数和EventArgs参数,也可以是其他参数,但一定要注意保证与事件函数的参数匹配。
在订阅事件时要把握好以下几点:
(1)首先接收类必须具有与事件自身具有相同签名(相同返回值类型和参数)的方法,然后该方法(称为事件处理程序)可以采取适当的操作来响应该事件。
(2) 每个事件可有多个处理程序,多个处理程序按顺序调用。如果一个处理程序引发异常,还未调用的处理程序则没有机会接收事件。基于这个原因,建议事件处理程序迅速处理事件并避免引发异常。
(3) 若要订阅事件,接收器必须创建一个与事件具有相同类型的委托,并使用事件处理程序作为委托目标,还要使用加法赋值运算符 (+=) 将该委托添加到源对象的事件中。
(4) 若要取消订阅事件,接收器可以使用减法赋值运算符(?=)从源对象的事件中移除事件处理程序的委托。
1. Windows窗体
Windows窗体是使用C#来建立基于窗口应用程序的出发点。不过,从窗体本身来看,它只是一个可移动的界面而已。虽然用户可以直接在窗体上绘制对象和文本,但是窗体的真正作用是充当Windows控件的容器。
控件的本质就是窗体的成员对象,用于显示信息并且接收用户输入的信息。
2. Windows窗体命名空间
Windows窗体的基类是Form,在System.Windows.Forms命名空间中定义.
.NET中的大多数控件都派生于System.Windows.Forms.Control类,该类定义了控件的基本功能。
.NET Framework中的窗体控件
数据显示 DataGridView
数据绑定和定位 BindingSource、BindingNavigator
文本编辑 TextBox、RichTextBox、MaskedTextBox
信息显示 Lable、StatusStrip、ProgressBar
网页显示 WebBrowser
列表与选择 CheckBox、CheckedListBox、ComboBox、RadioButton、ListBox、ListView、NumericUpDown、TreeView、DomainUpDown、TrackBar、
图形显示 PictureBox、ImageList
日期设置 DateTimePicker、MonthCalendar
对话框 ColorDialog、FontDialog、OpenFileDialog、PrintDialog、PrintPreviewDialog、FolderBrowerDialog、SaveFileDialog
命令 Button、LinkLabel、NotifyIcon、ToolStrip
菜单 MenuStrip、ContextMenuStrip
用户帮助 HelpProvider、ToolTrip
将其他控件分组 Panel、GroupBox、TabControl、SplitContainer、TableLayoutPanel、FlowLayoutPane
控件的属性
属性名称 说明
Anchor 获取或设置控件绑定到的容器的边缘并确定控件如何随其父级一起调整大小
BackColor 控件的背景色
Bottom 控件下边缘与其容器的工作区上边缘之间的距离(单位:像素)
Dock 获取或设置控件边框停靠到其父控件并确定控件如何随其父级一起调整大小
Enabled 控件是否可以对用户交互作出响应
ForeColor 控件的前景色
Height 控件的高度
Left 控件左边缘与其容器的工作区左边缘之间的距离(单位:像素)
Location 控件的左上角相对于其容器的左上角的坐标。
Name 控件的名称,这个名称可以在代码中用于引用该控件。
Parent 控件的父容器
Right 控件右边缘与其容器的工作区左边缘之间的距离(单位:像素)
Size 控件的高度和宽度
TabIndex 控件的 Tab 键顺序
TabStop 指示用户能否使用 Tab 键将焦点放到该控件上。
Text 与此控件关联的文本
Top 控件上边缘与其容器的工作区上边缘之间的距离(单位:像素)
Visible 指示是否显示该控件
Width 控件的宽度
按钮控件
Button(按钮)控件位于.NET Framework的System.Windows.Forms命名空间,它是从基类ButtonBase派生的。基类ButtonBase用于实现按钮控件所需的基本操作。
Button控件是一种常用控件,在需要用户做“确定”或“取消”之类的选择,通常都使用Button控件。 Button控件支持鼠标的单击和双击操作,也可以用<Enter>键来进行操作。
在设计时,通常在窗体上添加控件,然后双击它,为Click事件编写代码即可。在执行程序时,单击该按钮就会执行Click事件中的代码。
Name属性:用于设置对象的名称,以便在代码中引用。
系统自动给Button控件命名button1、button2……
最好给Name属性设置一个有实际意义的名称。
各种控件对象的Name属性只能通过“属性”窗口更改,该属性在设计时有效,运行时为只读。
Text属性:以文本形式显示在按钮上的标题文字。
除单击按钮外,还可以给按钮定义“Alt+快捷键”,见P155图7-2。
定义方法,在快捷键字母前面加上一个“&”字符。
例如:button1.Text = “确定(&Y)”; //显示标题为“确定(Y)”
Visible属性:决定该按钮是否可见
属性值为true可见,为false隐藏。
当一个控件不可见时,则不能响应用户的鼠标和键盘操作。
Visible属性在运行时生效。
Enabled属性:决定该按钮是否有效
属性值为false时按钮文字以灰色显示,对用户的操作不响应。
FlatStyle属性:决定该按钮的样式,值为FlatStyle枚举型
FlatStyle枚举型有4个枚举值,分别为Flat(平面显示)、Popup(平面显示,但鼠标移到时外观为三维)、Standard(三维显示)、System(外观由操组系统决定),效果见P156图7-3。
Button控件的FlatStyle属性默认为Standard。
Image属性:指定一个在按钮上显示的图像
ImageAlign属性:设置图像在按钮上的对齐方式
标签控件
作用:主要用于在窗体上显示文本
控件名:
Label:标准的Windows标签;
LinkLabel:类似于Label,但以超链接方式显示 ,效果见图7-4。
一般情况下,不需要为Label控件添加事件处理代码,但在需要时也可以支持事件
标签控件的常用属性
属性名称 说明
BorderStyle 控件的边框样式,默认为无边框
FlatStyle 设置平面样式外观。如果设置为PopUp,表示平面样式,当鼠标指向它时,控件显示为弹起样式。
Image 显示在 Label 上的图像
ImageAlign 控件中显示的图像的对齐方式
LinkArea 文本中显示为链接的范围(只用于LinkLabel)
LinkColor 显示普通链接时使用的颜色(只用于LinkLabel)
Links 获取包含在 LinkLabel 内的链接的集合 (只用于LinkLabel)
LinkVisited 链接是否显示为如同被访问过的链接(只用于LinkLabel)
TextAlign? 标签中文本的对齐方式
VisitedLinkColor 显示以前访问过的链接时所使用的颜色(只用于LinkLabel)
文本框控件
.NET FrameWork内置两个文本框控件: TextBox控件和RichTextBox控件,它们都派生于TextBoxBase,而TextBoxBase派生于Control类。
TextBoxBase提供了在文本框中处理文本的基本功能,例如选择文本、剪贴、粘贴和相关事件。
TextBox用途主要是让用户输入文本,也可以指定用户输入字符的类型,如只允许数值。默认情况下一个文本框最多输入2048个字符。如果将Multiline属性设为true,则最多可输入32k文本。用户文本保存在Text属性中,在程序中引用Text属性即可获得用户输入的文本。
RichTextBox多用于显示和输入格式化的文本(TextBox常用于录入较短的文本字符), RichTextBox可以显示字体、颜色和链接,从文件加载文本和加载嵌入的图像,及查找指定的字符, RichTextBox也被称为增强的文本框。
TextBox控件
属性名称 说明
CausesValidation? 是否验证用户输入的有效性
CharacterCasing 是否在字符键入时修改其大小写格式
MaxLength? 设置能输入的最大字符数,如果=0,则不受限制
Multiline 是否可以显示多行文本
PasswordChar 设置密码显示字符
ReadOnly? 文本是否为只读
ScrollBars 获取或设置哪些滚动条应出现在多行 TextBox 控件中
SelectedText? 表示当前选定的文本
SelectionLength? 当前选定的字符数
SelectionStart? 当前选定的文本起始点
Text 当前文本
WordWrap? 是否自动换行
事件名称 说明
Enter? 进入控件时发生这4个事件按列出的顺序触发,它们被称为“焦点事件”,当控件的焦点改变时触发,但Validating和Validated仅在控件接收了焦点且其CausesValidation设置为true时实被触发
Leave? 在输入焦点离开控件时发生
Validating? 在控件正在验证时发生
Validated? 在控件完成验证时发生
KeyDown 这3个事件统称为“键事件”,用于监视和改变输入到控件中内容,KeyDown和KeyUp?接收与所按下键对应的键码,可以来确定是否按下了特殊了键,如Shift、Ctrl或F1。KeyPress接收与键对应的字符
KeyPress
KeyUp?
TextChanged? 只要文本框中的文本发生了改变,就会触发该事件
RichTextBox控件
属性名称 说明
CanRedo? 指示在 RichTextBox 内发生的操作中是否有可以重新应用的操作
CanUndo? 指示用户在文本框控件中能否撤消前一操作
DetectUrls 当在控件中键入某个URL时,RichTextBox 是否自动设置 URL 的格式
Rtf 与Text属性相类似,但可包括RTF 格式的文本
SelectedRtf 获取或设置控件中当前选择的 RTF 格式的格式化文本
SelectedText 获取或设置 RichTextBox 内的选定文本
SelectionAlignment 选定内容或插入点的对齐方式,可以取值为Cente、Left或Right
SelectionBullet? 指示项目符号样式是否应用到当前选定内容或插入点
BulletIndent? 指定项目符号的缩进像素值
SelectionColor 获取或设置当前选定文本或插入点的文本颜色
SelectionFont 获取或设置当前选定文本或插入点的字体
SelectionLength? 获取或设置控件中选定的字符数
ShowSelectionMargin 如果把这个属性设置为true,在RichTextBox左边就会出现一个页边距,方便选择文本
UndoActionName 获取调用 Undo方法后在控件中可撤消的操作名称
SelectionProtected 把这个属性设置设置为true,可以指定不修改文本的某些部份
RadioButton控件
属性名称 说明
Appearance 获取或设置一个值,该值用于确定 RadioButton 的外观。
可选值:Normal和Button。每种类型都可显示文本或图像,或同时显示两者。
选择Normal后的外观: 。选择Button后的外观:
AutoCheck 如果这个属性为true,用户单击单选按钮时,会显示一个选中标记。如果该属性为false,就必须在Click事件处理程序的代码中手工检查单选按钮
CheckAlign 改变单选按钮的复选框的对齐形式,值可为枚举ContentAlignment 有效值之一。默认值为 MiddleLeft,意为内容在垂直方向上中间对齐,在水平方向上左边对齐
Checked 获取或设置一个值,该值指示是否已选中控件。如果选中控件,它就是true,否则为false
GroupBox控件
GroupBox (分组框)控件用于为其他控件提供可识别的分组。 通常,使用分组框按功能细分窗体。
当移动单个GroupBox控件时,它包含的所有控件也会一起移动。
在窗体上创建GroupBox控件及其内部控件时,必须先建立GroupBox控件,然后在其内建立各种控件。
Panel控件
Panel (面板)控件类似于GroupBox 控件。二者的区别在于,只有GroupBox 控件能显示标题,只有Panel 控件可以有滚动条 。
若要显示滚动条,需将 AutoScroll 属性设置为 true 。
可以通过设置 BackColor、BackgroundImage 和 BorderStyle 属性自定义面板的外观 。
TabControl控件
属性名称 说明
Alignment 控制选项卡在控件中的显示位置,默认为控件的顶部
Appearance 控制选项卡的显示方式,选项卡可以显示为一般的按钮或带有平面的样式
HotTrack 如为true,则当鼠标指针移过控件上的选项卡时,其外观就会改变
Multiline 如为true,则可以以多行显示选项卡
RowCount 返回当前显示的选项卡行数
SelectedItem 获取或设置当前选定的选项卡页的索引
SelectedTab 获取或设置当前选定的选项卡页,该属性在TabPages的实例上使用
TabCount 获取选项卡条中选项卡的数目。
TabPages 获取该选项卡控件中选项卡页的集合,使用这个集合可以添加和删除TabPages对象
StatusStrip 控件中窗格的常用属性
属性名称 说明
AutoSize 是否基于项的图像和文本自动调整项的大小
Alignment 设定StatusStrip控件上窗格的对齐方式,可选项包括:Center、Left和Right
BorderStyle 设定窗格边框的样式,可选项如下:
None:不显示边框; Raised:窗格以三维凸起方式显示;Sunken:窗格以三维凹起方式显示
Image 设定窗格显示的图标
MinimumSize 设定窗格在状态栏中的最小宽度
Spring 指定项是否填满剩余空间
Text 设定窗格的显示文本
Width 设定窗格的宽度,取决于AutoSize属性的设置,当窗体大小改变时该属性值可能会随之变化
Show方法将返回一个DialogResult枚举值指示对话框的返回值
成员 说明
Abort 对话框的返回值是 Abort(通常从标签为“中止”的按钮发送)?
Cancel 对话框的返回值是 Cancel(通常从标签为“取消”的按钮发送)?
Ignore 对话框的返回值是 Ignore(通常从标签为“忽略”的按钮发送)?
No 对话框的返回值是 No(通常从标签为“否”的按钮发送)?
None 从对话框返回了 Nothing。这表明有模式对话框继续运行?
OK 对话框的返回值是 OK(通常从标签为“确定”的按钮发送)?
Retry 对话框的返回值是 Retry(通常从标签为“重试”的按钮发送)?
Yes 对话框的返回值是 Yes(通常从标签为“是”的按钮发送)?
驱动器
.NET Framework提供DriveInfo类和DriverType枚举型,以方便在程序中直接使用驱动器。 DriveInfo类和DriverType枚举型位于System.IO命名空间。
DriveInfo类
作用:确定有关驱动器的信息,包括驱动器盘符、驱动器类型、驱动器上的可用空间等
常用成员:
字段:DriveFormat(文件系统格式,如NTFS或FAT32)、DriveType(驱动器类型)、Name(驱动器名)、TotalSize(总空间)、TotalFreeSpace(可用空间)
方法:GetDrives(获得可用驱动器列表)
perType枚举型
枚举值有CDRom(光驱)、Fixed(硬盘)、Network(网络驱动器)、Removable(软盘或U盘)等
目录
.NET Framework提供Directory类和DirectoryInfo类 ,以方便在程序中直接操作目录。 Directory类和DirectoryInfo类位于System.IO命名空间,都可以用来实现创建、复制、移动或删除目录等操作 。
Directory类
特点:静态类,可以直接调用其方法成员,但调用每个方法成员都要执行安全检查,以确定用户的操作权限。
常用方法成员:CreateDirectory(创建新目录)、Delete(删除目录)、Exists(判断目录是否存在)、Move(移动目录)、GetFiles(获得目录的文件列表)、GetDirectories(获得子目录列表)等
DirectoryInfo类
特点:非静态类(必须实例化),需要先创建实例才能调用其方法成员,在创建实例时执行安全检查。
常用字段成员;Name(提取目录名)、Exists(是否存在)、Parent(父目录)、Root(根目录)
常用方法成员:Create(创建目录)、CreateSubDirectory(创建子目录)、Delete(删除目录)、MoveTO(移动目录)、GetFiles、GetDirectories等
代码示例:P197
文件
NET Framework提供File类和FileInfo类 ,以方便在程序中直接操作文件。 File类和FileInfo类位于System.IO命名空间,都可以用来实现创建、复制、删除、移动、打开文件等操作。
File类
特点:静态类,可直接调用其方法成员。
常用方法成员:Open(打开文件)、Create(创建新文件)、Copy(复制文件)、Delete(删除文件)、Exists(判断文件是否存在)、Move(移动文件)、Replace(替换文件)、AppendAllText(新建文件并添加文本)、ReadAllText(打开并读取文本内容)等
FileInfo类
特点:非静态类,需要先创建实例。
常用字段成员:Name(提取文件名)、Directory(所属目录)、Exists(是否存在)、Extension(文件扩展名)、Length(文件长度)、IsReadOnly(是否为只读文件)
常用方法成员:Open、Create、CopyTo(复制到新文件)、Delete、MoveTo(移动文件)、Replace、EnCrypt(加密文件)、Decrypt(解密文件)等 。
代码示例:P198
路径
文件所在位置称为路径。路径由驱动器盘符、目录名、文件名、文件扩展名和分隔符组成。
路径的表示方法
绝对路径:从驱动器的根目录开始书写,例如C:\Windows\System32\notepad.exe
相对路径:从当前目录位置开始书写,例如System32\nodepad.exe(假设当前目录为C:\Windows)
C#将“\”字符视为转义字符,因此当路径表示为字符串时,要使用两个反斜杠表示,例如:
“C:\\Windows\\System32\\notepad.exe”
C#允许在字符串前添加“@”标志,以提示编译器不要把“\”字符视作转义字符,而视作普通字符,例如:
@“C:\Windows\System32\notepad.exe”
NET Framework提供Path类 ,以帮助在程序中管理文件和目录路径。Path类位于System.IO命名空间,是一个静态类。
Path类作用:静态类,用来操作路径的每一个字段,如驱动器盘符、目录名、文件名、文件扩展名和分隔符等。
Path常用字段成员:PathSeparator(路径分隔符)、DirectorySeparatorChar(目录分隔符)、VolumeSeparatorChar(卷分隔符)
Path常用方法成员:GetDirecotryName(取目录名)、GetFileName(取文件名)、GetExtension(取文件扩展名)、GetFullPath(取完整路径)、GetTempPath(取操作系统的临时文件路径)等
流包括以下基本操作。
读取(read):表示把数据从流传输到某种数据结构中,例如输出到字节数组中;
写入(write):表示把数据从某种数据结构传输到流中,例如把字节数组中的数据传输到流中;
定位(seek):表示在流中查询或重新定位当前位置。
操作流的类
(1) Stream类
Stream类是所有流的抽象基类。
Stream类的主要属性:CanRead(是否指出读取)、CanSeek(是否支持查找)、CanTimeout(是否可以超时)、CanWrite(是否支持写入) 、Length(流的长度)、Position(获取或设置当前流中的位置)、ReadTimeout(获取或设置读取操作的超时时间)、WriteTimeout(获取或设置写操作的超时时间)
Stream类的主要方法:BeginRead(开始异步读操作)、BeginWrite(开始异步写操作)、Close(关闭当前流)、EndRead(结束异步读操作)、EndWrite(结束异步写操作)、Flush(清除流的所有缓冲区并把缓冲数据写入基础设备)、Read(读取字节序列)、ReadByte(读取一个字节)、Seek(设置查找位置)、Write(写入字节序列)、WriteByte(写入一个字节)
(2) StreamReader和StreamWriter类
一般用来操作文本文件
流读取器StreamReader类用来以一种特定的编码从字节流中读取字符。
流写入器StreamWriter类用来以一种特定的编码向流中写入字符。
(3) FileStream、MemoryStream和BufferStream类
文件流FileStream类:以流的形式来读、写、打开、关闭文件。
内存流MemoryStream类:表示在内存中创建流,以暂时保存数据,有了它就无需在硬盘上创建临时文件。
缓存流BufferStream类 :先把流添加到缓冲区,再进行读/写操作,使用缓冲区可以减少访问数据时对操作系统的调用次数。
注意, FileStream类也具有缓冲功能,在创建FileStream类的实例时,只需要指定缓冲区的大小即可。
读写文本文件
文本文件是一种纯文本数据构成的文件,只保存了字符的编码。
NET Framework支持的字符编码
可以是ASCIIEncoding、UTF7Encoding、UTF8Encoding、UnicodeEncoding或UTF32Encoding
在.NET Framework中读写文本文件主要使用:
文件读取器TextReader类和文本写入器TextWriter类
它们的派生类流读取器StreamReader类和流写入器StreamWriter类
或StringReader和StringWriter类
TextReader类及其派生类常用方法:
Close(关闭读取器并释放系统资源)、Read(读取下一个字符,如果不存在,则返回-1)、ReadBlock(读取一块字符)、ReadLine(读取一行字符)、ReadToEnd(读取从当前位置直到结尾的所有字符)
TextWriter类及其派生类常用方法:
Close (关闭编写器并释放系统资源) 、Flush(清除当前编写器的所有缓冲区,使所有缓冲数据写入基础设备)、Write(写入文本流)、WriteLine(写入一行数据)
ASP.NET简介
ASP.NET是一种动态网页设计技术,它比其他任何一种动态网页设计技术更容易使用。它是一种可升级的Web应用程序开发技术,特别擅长于用户交互和数据处理。
ASP.NET不是程序设计语言,是建立在.NET Framework基础之上的程序设计框架,它用来创建Web应用程序。
ASP.NET的语法与ASP 兼容,但ASP 应用程序不能直接在ASP.NET环境下运行,需要适当修改。
ASP.NET与ASP的最大区别在于:前者是编译型的动态网页技术,而后者是解释型的动态网页技术。
ASP.NET比较流行的版本是1.1版、2.0版和3.0版。与Visual Studio.NET 2003一起发布的ASP.NET是1.1版,与Visual Studio.NET 2005一起发布的ASP.NET是2.0版。在2007年与Visual Studio.NET 2008一起发布的ASP.NET是3.0版。
ASP.NET的优势
可管理性 好
安全性 高
易于部署
性能较ASP和JSP来说大大增强
具有灵活的输出缓存技术
使用Unicode编码,实现了国际化
支持移动设备
扩展性和可用性 好
提供跟踪服务和调试功能
集成于.NET Framework之中,功能强大
数据库连接使用ADO.NET技术
设计Web应用程序的一般步骤
利用VS 2005设计Web应用程序的操作步骤
S1:新建网站
S2:设置网站位置
S3:添加网页
S4:设计Web窗体
S5:设置窗体及窗体控件的属性
S6:编写程序
S7:执行Web应用程序
S8:查看运行结果
注意,详细情况请参见教材
(1) 生成Web应用程序
操作方法:在Visual Studio .NET 2005的解决方案资源管理器窗口中,右击网站名并选择“生成网站”
(2) 检查Web服务器是否正常
如果要发布到本地计算机,则必须检查本地计算机是否安装了IIS
检查IIS是否正常工作
表、记录和字段
关系数据库系统采用关系模型作为数据的组织方式。
表是按某一公共结构存储的一组相似数据,类似于日常生活中的表格。
表按行列方式将相关的信息排列成逻辑组。表中的每一行称为记录。
列称为字段
数据库
数据库将数据表表示为多个表的集合,通过建立表之间的关系来定义数据库的结构
所谓主键是指用来惟一标识表中记录的一个或一组字段。主键不允许有重复值。
外键是指用来连接另一个表、并在另一表中为主键的字段。
索引
在关系数据库中,通常使用索引来提高数据的检索速度。
记录在表中是按输入的物理顺序存放的,当为主键或其它字段建立索引时,数据库管理系统将索引字段的内容以特定的顺序记录在一个索引文件上。
检索数据时,数据库管理系统先从索引文件上找到信息的位置,再从表中读取数据。
每个索引都有一个索引表达式来确定索引的顺序,索引表达式既可是一个字段,也可是多个字段的组合。
可以为一个表生成多个索引,每个索引均代表一种处理数据的顺序。
关系
关系数据库的最大好处就是能够避免数据的不必要的重复,即可以将包含重复数据的表拆分成若干个没有重复数据的简单表,并通过建立表与表之间的关系来检索相关表中的记录。
在表与表的关系中,习惯上称主表为父表,而通过关系连接的其他表为子表。
表与表之间可能会有4种关系
一对一关系:指父表中的记录最多只与子表中的一条记录相匹配,反之亦然;
一对多关系:指父表中的记录与子表中的多条记录有关。例如,对于客户表和订单表来讲,每个订单只与一个客户有关,而每个客户可以有多个订单,因此客户表和订单表是一对多的关系;
多对一关系:与一对多是互补的,即父表中的多条记录与子表中的一条记录相关;
多对多关系:指父表中的多条记录与子表中的多条记录有关。
SQL简介
SQL(Structured Query Language)语言是一个综合的、通用的关系数据库语言,其功能包括查询、操纵、定义和控制。
目前,SQL标准有3个版本。
SQL-89
SQL-92
SQL3
Microsoft SQL Server使用的Transact-SQL是在SQL-92标准基础上扩充而来的。
SQL的构成
SQL由命令、子句和运算符等元素所构成的,这些元素结合起来组成用于创建、更新和操作数据的语句。
SQL命令分两大类DDL(数据定义语言)命令和DML(数据操纵语言)命令。DDL命令用于创建和定义新的数据库、字段和索引,主要包含语句:create、drop、alter。DML命令用于创建查询,以便从数据库中排序、筛选和抽取数据,主要包含语句:select、insert、update、delete。 P258
SQL子句用于定义要选择或操作的数据。
select语句
select语句的功能是从现有的数据库中检索数据。
from子句指定数据的来源,即指出记录来自哪些表。
where子句指定选择记录时要满足的条件。
group by 子句对记录分组。
having子句确定在带group by子句的查询中具体显示哪些记录,可以用having子句来显示满足指定条件的分组。
order by子句对记录排序。
语句示例见P258-260
delete语句
delete语句的功能是删除from子句列出的、满足where子句条件的一个或多个表中的记录。
如:
delete from Orders Where OrderId=16
insert语句
insert语句用于添加记录到表中。
如:
insert into Orders
(CustID,ProductID,OrderDate,SendDate,Qty)
values(‘2’,’5’,’2008-8-12’,’2008-8-13’,1)
update语句
update语句按某个条件来更新特定表中的字段值。
如:
update Products set Price=8900 where Products.ProductId=3
ADO.Net概述
ADO.NET是一种Microsoft最新、最强大的数据库访问技术,应用程序通过ADO.NET可以非常方便地访问并处理存储在各种数据库中的数据。
ADO.NET聚集了很多进行数据处理的类,这些类有强大的对数据访问、处理的功能,如索引、排序、浏览和更新。
ADO.NET集成在.NET Framework中,可以用于任何支持.NET的计算机语言,如C#。
ADO.NET主要包括与System.Data命名空间及其嵌套的命名空间,以及system.Xml命名空间等一些与数据访问有关的专用类。
Data Provider
Data Provider提供了DataSet和数据库之间的联系,同时也包含了存取数据库的一系列接口。通过数据提供者所提供的应用程序编程接口(API),可以轻松地访问各种数据源的数据。
.NET数据提供程序包括以下几个:
SQL Server .NET 数据提供程序,用于Microsoft SQL Server 数据源,来自于System.Data.SqlClient 命名空间;
OLE DB .NET 数据提供程序,用于OLE DB 公开的数据源数据源,来自于System.Data.OleDb 命名空间;
ODBC.NET 数据提供程序,用于ODBC 公开的数据源来自于System.Data.Odbc 命名空间;
Oracle .NET 数据提供程序用于Oracle 数据源,来自于System.Data.OracleClient 命名空间。
Data Provider
.NET Data Provider有4个核心对象:
Connection对象用于与数据源建立连接;
Commmand对象用于对数据源执行指定命令;
DataReader对象用于从数据源返回一个仅向前的(forward-only)只读数据流;
DataAdapter对象自动将数据的各种操作变换到数据源相应的SQL语句。
DataSet
ADO.NET和核心组件是DataSet。
可以将DataSet想像成内存中的数据库,它是不依赖于数据库的独立数据集。独立是指即使断开数据连接或关闭数据连接,DataSet依然可用。
在ADO.NET中,DataSet是专门用来处理从数据源获得数据,无论底层的数据是什么,都可以使用相同的方式来操作从不同数据源取得的数据。
DataSet内部是用XML来描述数据的。XML是一种与平台无关、数据无关且能描述复杂数据关系的数据描述语言。
ADO.NET操作数据库的流程
首先使用Connection对象连接数据库;
如果执行不需要返回结果的数据库执行命令或存储过程,可以使用Command对象;
DataReader对象用于从数据源中读取仅向前和只读的数据流。
DataSet是数据的内存驻留表示形式,它提供了独立于数据源的一致关系编程模型。DataSet表示整个数据集,其中包含表、约束和表之间的关系。
与现有数据源的交互通过 DataAdapter 来控制。DataAdapter对象用于从数据源中获取数据、填充DataSet中和表和约束并将对DataSet的更改提交回数据源。
使用Connection对象访问数据库
连接数据库步骤
(1)定义连接字符串
使用SQL Server身份验证:
Data Source=服务器名;Initial Catalog=数据库名; User ID=用户名;Pwd=密码
使用Windows身份验证:
Data Source=服务器名;Initial Catalog=数据库名;
Integrated Security=True
(2)创建 Connection 对象
SqlConnection connection = new SqlConnection(connString);
(3) 打开与数据库的连接
connection.Open( );
使用Command对象访问数据库
使用 ExecuteNonQuery() 的步骤:
(1)创建 Connection 对象;
(2)定义sql 语句;
(3)创建 Command 对象;
(4)执行 ExecuteNonQuery() 方法;
(5)根据返回的结果进行处理。
关于C#中的概念介绍就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果喜欢这篇文章,不如把它分享出去让更多的人看到。