版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1C#
程序设计2第1章C#程序设计概述1.1.NET和C#简介1.2编写一个简单的C#程序1.3编辑、编译和运行一个C#程序31.1.1什么是.NETMicrosoft.NET是微软开发的平台,是一种面向网络、支持各种用户终端的开发平台环境。VisualStudio.NET是Microsoft为实现其.NET技术而开发的一整套工具组件。它把开发功能强大、性能可靠的企业网络解决方案进行了简化。利用VisualStudio.NET,用户可以非常轻松地创建具有自动伸缩能力的可靠的应用程序和组件。41.1.2.NET框架.NET框架包括以下组件:1.公共语言运行环境(CLR)2..NET框架类库(BCL)3.数据库访问组件(ADO.NET和XML)4.基于ASP.NET编程框架的网络服务(WebServices)和网络表单(WebForms)5.Windows桌面应用界面编程组件(WinForms)51.1.3C#语言简介C#从C和C++派生而来,但却是完全重新开发的。微软公司借用了C和C++中一些已有的东西,并加入了新特性。这些特性使该语言更容易使用,其中的许多特性与Java极其类似。此外,它还结合了Delphi和VisualBasic的很多优秀特性。
1.简单
2.面向对象
3.强大灵活
4.类型安全
5.版本可控
6.兼容返回目录6例1-1:一个简单的欢迎程序。//声明命名空间usingSystem;//程序开始类classWelcome{ //Main方法
publicstaticvoidMain() { //向控制台输出
Console.WriteLine("WelcometoC#!"); } }71.2.1注释注释常被用来提供关于程序清单的描述性信息,以使程序具有可读性。注释语句不参与程序的执行。1.单行注释 格式为:
//注释内容 用两个斜杠表示注释的开始,直到该行的结尾注释结束。82.多行注释 格式为:
/*注释内容第1行
…
注释内容第n行*/
从“/*”开始到“*/”结束的内容均为注释内容,注释内容可以跨越多行。注意:多行注释不能嵌套。93.文档注释文档注释使用3个斜杠“///”符号。这种注释可帮助用户创建自定义外部文档代码。C#利用文档注释,使用XML的标记来获得程序代码的XML文档,即可把对一个程序的注释转换为一个文档保存,所以文档注释又称为XML注释。101.2.2命名空间的声明实际中的C#程序通常包含多个文件,其中每个文件都可以包含一个或多个命名空间。命名空间和数据类型一样必须有唯一的名称。在一个C#程序中,可以通过一个元素的完整资格名称来识别它,这个资格名称表明出层次关系。
例如,System.String是.NETString类型完整的资格名称。但是为了简化代码起见,只要声明正在使用System命名空间:
usingSystem;
就可以使用一个相对名称如String来作为完整名称的同义词,而最后依然代表System.String。111.2.3Main方法Main方法是一个静态方法,它位于一个类或一个结构体中。声明Main方法的方式有三种:1.返回一个空值
staticvoidMain() { … }122.返回一个整数
staticintMain() { … return0; }3.带有参数值
staticintMain(string[]args) { … return0; }131.2.4输入和输出1.输入
Console.Read() Console.ReadLine()
这两种方法都用于从键盘读取信息,存入某个变量中,所不同的是:Console.ReadLine()方法用于将获得的数据保存在字符串变量中,而Console.Read()方法用于获得用户输入的任何值(可以是任何的字母或数字)的ASCII值。142.输出
Console.Write() Console.WriteLine()
这两种方法都用于向屏幕输出结果,它们可用于所有的数据类型,所不同的是:Console.WriteLine()方法先输出信息后换行,而Console.Write()方法不换行输出信息。返回目录151.3.1编辑C#源代码
操作过程(略)161.3.2编译并运行程序1.命令行方式2.菜单方式(编译和运行同步完成)3.菜单方式(编译和运行分步完成) 操作过程(略)返回目录17第2章数据类型2.1值类型2.2引用类型2.3装箱和拆箱2.4类型转换18表2-1C#的值类型192.1.1简单类型1.整数类型整数类型的变量的值为整数。C#支持八种整数类型:sbyte、byte、short、ushort、int、uint、long、ulong和char。2.布尔类型布尔类型表示的逻辑变量只有两种取值:“真”或“假”,在C#中,分别采用“true”和“false”两个值来表示.203.字符类型 字符包括数字字符、英文字母和表达符号等。 例如:给一个字符变量赋值:
charc='A'; charc='\x0032'; charc='\u0032';4.实数类型 (1)浮点类型 单精度(float)和双精度(double) (2)十进制类型 十进制类型(decimal)适合应用在不能接受舍入误差的计算中,当定义一个decimal变量并赋值给它时,使用m下标。212.1.2结构类型把一系列相关的变量组织成为一个单一实体的过程,称为生成结构的过程;这个单一实体的类型称为结构类型;每一个变量称为结构的成员。结构类型的变量采用struct来进行声明。对结构成员的访问通过结构变量名.成员名。22例:定义职工worker结构类型:structworker{ publicstringname; publicuintage; publicstringphone; publicstringaddress; };workerp1;=“Tom”;232.1.3枚举类型定义枚举类型的形式如下:enum枚举类型名{数据1,数据2,…,数据n};例如,定义一个名为color的表示颜色的枚举类型:enumcolor{ Red,Green,Blue,White,Black};colorc1//定义一个枚举变量c1;c1=Green;24同样也可以访问枚举成员,其格式为: 枚举名.枚举成员名例如,要访问color中的Blue元素,其代码为:
color.Blue返回目录25C#中的引用类型有四种:类、数组、代表和接口。特殊数值null是所有引用类型都适用的,并且表示缺乏实例。当一个引用不为null时,它始终指向一个特定类型的对象,而且该对象已被堆栈分配。262.2.1类1.object类定义object类型引用变量的形式为:object标识符[=数值]; 例如:objectabc1; objectabc2=5.75; 272.string类定义字符串引用变量的形式为:string引用标识符[=”字符串字面值”];例如:stringString1=“hello”;stringString2=“hello”+“world”;charString4=String1[0];boola=(String1==String2);282.2.2数组数组是一种数据结构,包含于数组中的变量,也称为数组的元素,都有相同的类型,而这个类型被称为数组的类型。可以使用new运算符在C#中创建数组,数组必须先声明再使用。在数组声明的时候可以对数组元素进行赋值,或者叫做对数组的初始化,也可以在使用的时候进行动态赋值。在C#中数组可以是一维的,也可以是多维的,同样也支持矩阵和不规则的数组。29例2-1:创建一个一维int类型数组,初始化数组元素并且把每个元素打印出来。usingSystem;classTest{ staticvoidMain() { int[]arr=newint[5]; for(inti=0;i<arr.Length;i++) arr[i]=i*i; for(inti=0;i<arr.Length;i++) Console.WriteLine("arr[{0}]={1}",i,arr[i]); }}30一个数组的每一维都有相应的长度,这个长度是一个大于或等于零的整数,Array类提供了Length成员查询数组的长度。System.Array类型是所有数组类型的抽象基类型,系统中存在从任意数组类型到System.Array类型的隐式转换。使用System.Array类的属性的语句格式为:数组名.属性名312.2.3代表代表(Delegates)是一种指向一个静态方法或一个对象的对象实例和对象方法的数据结构。代表实际上相当于C#中的函数指针。定义和使用代表分为三步:声明、实例化和调用。在声明代表时,只需要指定代表指向的原型的类型,它不能有返回值,也不能带有输出类型的参数。例如:
delegatevoidMyDelegate(); //声明一个名为
//MyDelegate的代表,它没有任何参数并且返回void值322.2.4接口接口定义了一个连接,一个类或者结构必须根据它的连接来实现接口。接口可以包含一个和多个成员,这些成员可以是方法、属性、索引指示器和事件,但不能是常量、域、操作符、构造函数或析构函数,而且不能包含任何静态成员。33例如:interfaceIExample{ stringthis[intindex]{get;set;} eventEventHandlerE; voidF(intvalue); stringP{get;set;}}publicdelegatevoidEventHandler(objectsender,EventArgse);返回目录342.3.1装箱
装箱就是将值类型变量隐式地转换为object对象类型变量,或转换为任何该值类型所执行的接口类型。具体过程是:把一个值类型装箱,就是创建一个object对象类型的实例,并把该值类型的值复制给该实例。 例如:
intval=1000; objectobj=val;//装箱,将val的值复制给obj
在装箱后对val的任何修改均不会影响到obj对象的内容。352.3.2拆箱
拆箱是装箱的逆过程。具体过程是:先确认object类型实例的值是否为给定值类型的装箱值,然后将这个实例的值复制给新的给定值类型的变量。 例如:
intval=1000; objectobj=val; //装箱
intval1=(int)obj; //拆箱 当装箱时,不需要显式地进行强制类型转换;当拆箱时,必须显式地进行类型转换。返回目录362.4.1隐式类型转换
隐式类型转换是系统默认的、不需要任何声明就可以进行的转换,它是由编译器根据不同类型数据间转换规则自动完成的,又称为自动转换。 例如:
bytea=100; byteb=a; //相同类型隐式转换
floatc=a; //不同类型隐式转换37
隐式转换遵守“由低级类型向高级类型转换,结果为高级类型”的原则,从而保证计算精度。隐式数值转换隐式枚举转换隐式引用转换382.4.2显式类型转换
显式类型转换就是强制执行从一种数据类型到另一种数据类型的转换,因此也称为强制类型转换,一般用强制类型转换符来实现。 显式类型转换的格式为:
(类型名)变量或表达式 例如:
inti,h; floatj=4.5; i=(int)j; h=j;39
与隐式类型转换相比,显式类型转换不一定总成功,有可能会造成数据信息的丢失或产生异常。 显式转换包括所有的隐式转换。显式数值转换显式枚举转换显式引用转换返回目录40第3章常量与变量3.1词法说明
3.2变量3.3常量3.4运算符和表达式413.1.1标识符C#语言的标识符名称必须遵守以下规则:所有的标识符只能由字母、数字和下划线这三类字符组成,而且第一个字符必须为字母或下划线;标识符中不能包含空格、标点符号、运算符等其他符号;标识符区分大小写;标识符不能与C#关键字名相同。标识符不能与C#中的类库名相同。423.1.2关键字关键字(Keyword)也称为保留字,它是由系统预先定义好的标识符,在C#语言中有特定的含义。C#语言的关键字如表3-1所示。在C#中,如果在关键字前加上前缀“@”,则可以使它变为合法的标识符。43返回目录44变量(Variable)是计算机内存中被命名的数据存储单元,其中存储的值是可以改变的。变量名实际上是一个符号地址,在对程序进行编译时由系统给每个变量分配一个真正的内存地址。在程序中通过变量取值,实际上就是通过变量名找到相应的内存地址,再从中读取数据或存入数据。453.2.1变量的命名符合标识符的命名规则最好“见名知意”463.2.2变量的使用1.定义(声明)变量变量必须先定义(声明)后使用。定义变量的一般格式为:
[特征][修饰符]数据类型变量名1,变量名2,…,变量名n;例如:
intcount;//声明了一个存放整数的变量count bytea,b,c;//声明了三个存放8位无符号整数的变量a、b、c472.变量的赋值一般格式为:
变量名=表达式;在程序中,可以给一个变量多次赋值,变量的当前值等于最后一次给该变量所赋的值。3.变量的初始化其一般格式为:[特征][修饰符]数据类型变量名1=表达式1,…,变量名n=表达式n;例如:
intcount=5;另有一种定义变量并对其初始化的方法是:使用new操作符,调用C#值类型的默认构造函数并对变量赋予默认值。484.变量的作用域和生存周期作用域定义了一个变量的可见性和生存周期。一个变量的生存周期被限制在它自身的作用域内。作用域可以嵌套。在内层作用域定义的变量不能和外层作用域中定义的变量重名。493.2.3变量的类型1.静态变量使用static修饰符定义的变量称为静态变量。对静态变量的访问只能通过类型名,而不能用实例名访问。静态变量的初始值就是该类型变量的默认值。静态变量最好在定义时赋值。例如:staticinta=10;502.实例变量不使用static修饰符定义的变量称为实例变量。例如:inta;类中的实例变量结构中的实例变量3.数组元素数组中每个元素的初始值为该数组元素类型的默认值。数组元素最好在初始化时被赋值。514.值参数值参数向方法中传递的是数据的值。5.引用参数当一个带有ref修饰符的参数被声明时,称为引用参数;向它传递的不是值而是对调用变量的引用。6.输出参数当一个带有out修饰符的参数被声明时,称为输出参数。它只能用于传递方法返回的数据,而不能向方法内部传递参数。527.局部变量局部变量被局部变量声明语句创建。当控制权进入block块、for循环语句或者switch分支语句时,其中的相关局部变量被创建。当控制权离开block块、for循环语句或者switch分支语句时,其中的相关局部变量随即失效。局部变量不会被自动初始化。在一个局部变量的有效范围中,在它被声明之前的所有关于它的引用都是错误的。返回目录53常量(Constant)是指在程序执行过程中其值不能被改变的量。定义常量的一般格式为:
[特征][修饰符]const数据类型常量名=表达式;例如:
constPI=3.14159;返回目录543.4.1C#运算符单目运算符:如-x、x++、sizeof(x);双目运算符:如x+y、x%y;三目运算符:如条件运算符“?:”。553.4.2运算符的优先级和结合性563.4.3赋值运算符及其表达式1.一般的赋值运算赋值表达式的格式如下: 变量=表达式;例如:
inti=10;2.赋值中的类型转换如果赋值运算发生在不同的数据类型之间,当它们是兼容的数据类型时,则右边的值自动转换成左边的变量类型。573.复合赋值复合赋值运算符是双目运算符与赋值运算符的组合,简化了赋值语句的书写,其形式为:
xop=y例如:
a+=b a-=b a*=b583.4.4算术运算符及其表达式+(加法运算符,或正值运算符,如1+2,+3)-(减法运算符,或负值运算符,如1-2,-3)*(乘法运算符,如1*2)/(除法运算符,如1/2)%(模运算符或称求余运算符,如7%3=1)593.4.5关系运算符及其表达式比较运算符:
<(小于)、<=(小于等于)、
>(大于)、>=(大于等于),等式运算符:
==(等于)、!=(不等于)关系运算符用于两个值进行比较,其运算结果为“true”(真)或“false”(假)。603.4.6逻辑运算符及其表达式逻辑表达式的结果是一个布尔值,结果为真则为true,结果为假则为false。C#中的逻辑运算符如下:
&&(逻辑与)
||(逻辑或)
!(逻辑非)。613.4.7位运算符及其表达式位运算符是对其操作数按其二进制形式逐位进行运算,参加位运算的操作数必须为整型或者是可以转换为整型的任何其他类型。C#中的位运算符如下:~(按位求反)、&(按位与)、|(按位或)^(按位异或)、<<(左移)、>>(右移)623.4.8条件运算符及其表达式条件表达式的一般格式为: 表达式1?表达式2:表达式3例如:
max=((a>b)?a:b)在C#中第一个操作数必须是一个布尔表达式,或者是可以转换为布尔类型的表达式,否则编译会出现错误。633.4.9自增、自减运算符自增(++)、自减(--)运算符都是单目运算符,其作用是以一种紧凑格式使变量的值自动增1或减1。运算符后置用法,代表先使用变量,然后对变量增值运算符前置用法,代表先对变量增值,再使用变量643.4.10其他运算符1.new运算符
new操作符用于创建一个新的类型实例。它有三种形式:(1)对象创建表达式(2)数组创建表达式(3)代表创建表达式例如:
classA{};Aa=newA; int[]int_arr=newint[10]; delegatedoubleDFunc(intx);DFuncf=newDFunc(5);652.is运算符“is”是获取类型信息的运算符,其运算结果是布尔值true或false。is表达式的一般格式为: 变量(表达式)is数据类型3.as运算符as运算符也是用来进行相关的数据类型的判断.as表达式的一般格式为: 表达式1=表达式2as数据类型664.typeof运算符typeof运算符可以获得指定类型的System.Type对象。typeof表达式的一般格式为:
typeof(类型)5.sizeof运算符sizeof运算符用于计算所定义的数值型变量在内存中占多少字节。sizeof表达式的一般格式为:
sizeof(变量类型) 这个表达式的结果是一个整数,代表变量所占的字节数。676.checked和unchecked运算符checked和unchecked运算符用来控制整数类型算术运算和相互转换的溢出检查。其表达式的一般格式为:
checked(表达式)
unchecked(表达式)checked运算符用来强制编译器检查是否溢出的问题;unchecked运算符用来强制编译器不检查这方面的问题。返回目录68第4章控制台输入/输出4.1控制台I/O类4.2控制台输入4.3控制台输出4.4文件操作69控制台I/O是由System.Console类提供给用户访问标准输入、标准输出以及标准错误流,如表4-1所示。返回目录704.2.1Console.Read()方法Read()方法是一个静态方法,调用的格式为:
Console.ReadRead()方法每次从标准输入流中读取一个字符,程序将接收的字符作为int型值返回给变量。如果输入流中没有可用字符,则返回-1。714.2.2Console.ReadLine()方法ReadLine()方法也是一个静态方法,调用的格式为:
Console.ReadLineReadLine()方法用于从控制台中一次读取一行字符串,直到遇到Enter键才返回读取的字符串。但此字符串中不包含Enter键和换行符(‘\r\n’)。如果没有接收到任何输入,或接收了无效的输入,那么ReadLine()方法将返回null。返回目录724.3.1基本的数据输出基本数据类型的简单输出形式为:
Console.Write(“格式串”,参数表);或
Console.WriteLine(“格式串”,参数表);734.3.2格式化输出1.标准格式化输出 其使用形式为:
Console.WriteLine(“格式”,对象1,…); 其中,格式含静态文本和标志符两部分,标志符表示由参数表所替换的项目以及它的格式化。通用的格式为:
{N[,M][:格式串]}742.自定义格式化输出 一般形式为:
Console.WriteLine(“{项目数},{0:自定义格式说明符}”,参数表);3.日期和时间的格式化输出(1)获取日期和时间 可以通过DateTime类获取完整的日期和时间。(2)格式化日期和时间 日期和时间的格式化说明符如表4-5所示。754.3.3字符串的处理方法1.String类的字符串方法(1)可以直接输出字符串,也可以使用“+”操作符来连接字符串进行输出。(2)可以使用索引值,从一个字符串的某一特定位置提取一个字符。(3)可以调用string类的所有属性和方法,调用格式为:String.方法名()。762.StringBuilder类的字符串方法 命名空间System.Text中的StringBuilder类用于创建存储可修改字符串的对象。3.Parse()方法
Parse()方法可以将字符串转换为数值类型数据,而且被转换的字符串可以包含格式化数据,也可以是由数字字符组成的字符串。 调用Parse()方法的常用格式为:
publicstatic数据类型.Parse(strings);774.Convert类
Convert类用于将某个基本数据类型转换为另一个基本数据类型。 调用格式为:
Convert.方法名(原数据变量);返回目录784.4.1创建一个文本文件可利用File类中的CreateText方法来创建一个文本文件。CreateText方法的参数之一是所要创建文件的路径,它在指定路径创建一个文件,并返回一个StreamWriter对象,这个对象可以用来向文件中写入内容。794.4.2读写文本文件1.从一个文本文件中读出内容可利用File类中的OpenText方法来从一个文本文件中读出内容。它打开指定路径的文件,并返回一个StreamReader对象,该对象用来读出文件的内容。2.将内容写入一个文本文件中可利用File类中的AppendText方法来向一个文本文件中写出内容,AppendText方法的参数是所要写入内容的文本文件的路径。它打开指定路径的文件,并返回一个StreamWriter对象,该对象用来向文件写入内容。804.4.3删除文件File类中有静态方法Delete用来删除文件,但它不能删除只读文件,所以在执行删除操作之前要进行判断,将只读文件设置为非只读。删除目录中的所有文件,包括该目录的子目录中的文件,这就需要进行递归调用。返回目录81第5章程序流程控制5.1操作运算语句
5.2选择语句5.3循环语句5.4转移语句5.5预处理指令825.1.1终点与可达性直观地说,语法上语句书写完成的地方就是该语句的终点。如果一条语句可以被执行,则称它是可达的(reachable);相反,如果一条语句无法被执行,我们称它是不可达的(unreachable)。835.1.2函数调用语句函数调用语句由函数调用加一个分号“;”构成一条语句。例如:
Console.WriteLine(“HelloWorld!”);845.1.3语句块语句块也被称为复合语句,它是用一对花括号“{}”括起的语句序列。假如此语句序列被省略,则称块为空。块可以嵌套。855.1.4空语句空语句不进行任何操作。一条空语句的执行只是简单地把控制跳到语句的结束点。空语句可以被用在while语句中,此时它含有一个空地执行体.865.1.5标号语句一个标号语句允许一条语句前加上一个标号。标号语句可以被用在语句块中,但不允许出现在嵌套语句中。一个标号可以在它的作用域内通过goto语句来引用.执行一条标号语句时,就是执行标号后面的语句。875.1.6声明语句声明语句可以声明一个局部变量或常量。声明语句可以在语句块中出现,但是不允许在嵌套语句中出现。1.局部变量声明2.局部常量声明885.1.7表达式语句表达式语句由一个表达式后接一个分号“;”组成。在C#语言中,只有以下四类表达式可以成为表达式语句:(1)new对象创建表达式;(2)调用表达式;(3)赋值表达式;(4)自增、自减表达式。返回目录895.2.1if语句if语句是条件选择语句,其常用的表达形式有:
if(布尔表达式)
{语句组;
}或
if(布尔表达式)
{语句组1;
} else {语句组2;
}90if语句的控制流程:if语句可以嵌套使用,每一条else与离它最近且没有其它else与之对应的if相搭配。91还可以使用else-if方法处理多个条件:if(布尔表达式1)
{语句组1;}elseif(布尔表达式2)
{语句组2;}……elseif(布尔表达式n)
{语句组n;}else{语句组n+1;}925.2.2switch语句switch(表达式){case常量表达式1:
{语句组1}break;case常量表达式2:
{语句组2}break;……case常量表达式n:
{语句组n}break;default:
{语句组n+1}break;}93在C#中程序员必须显式地告诉编译器停止switch语句的执行,这就要在switch语句中每个执行单元后添加break语句。当程序遇到break语句时,switch语句终止执行,程序的控制转移到switch语句后紧接的一条语句。如果想让C#像C++那样,执行完某个case语句后能继续遍历其它的语句,则只需要明确地加入下面这两条跳转语句即可:
gotocaselabel:跳至标签语句执行;
gotodefault:跳至default标签执行。switch语句后面括号中的表达式类型可以是string类型。返回目录945.3.1while语句while(布尔表达式){
循环体}使用break语句结束while循环,执行后续语句;使用continue语句停止循环体的执行,继续进行while循环。955.3.2do-while语句do{
循环体}while(布尔表达式);同样允许用break语句和continue语句965.3.3for语句for(表达式1;布尔表达式2;表达式3){
循环体}975.3.4foreach语句foreach(变量类型循环变量in集合表达式){
循环体}981.对数组使用foreach语句foreach语句可用来为数组中的每一个元素执行一遍循环体中的语句。因为不需要数组中的元素直接参与运算,也不需要事先知道数组元素的个数,所以对全体数组进行操作时用foreach语句效率很高。2.对集合使用foreach语句 若要循环访问集合,在foreach语句中集合必须满足下列条件:集合类型必须是interface、class或struct类型,还必须包括返回类型的GetEnumerator的实例方法。循环变量类型包含一个Current属性(返回集合的当前元素)和MoveNext()方法。返回目录995.4.1break语句break语句用于终止最内层的while、do-while、for和switch语句的执行。当程序遇到这一语句后,执行紧接在被终止执行的语句后面的语句。其语法格式为:
break;1005.4.2continue语句当程序遇到这一语句后,停止当前进行的这次循环并把控制返回到当前循环的顶部,以便于进行下一次循环。与break语句不同的是,continue语句不是终止整个循环的执行,而仅仅终止当前这一次循环的执行。其语法格式为:
continue;1015.4.3goto语句goto语句也能用来跳出循环和switch语句。它无条件地转移程序的执行控制,其转移目的地是一标号,因此要求标号与goto语句处在同一个函数中。其语法格式为:
goto标号; gotocase表达式; gotodefault;由于大量或随意使用goto语句会使程序的流程无规律,程序的可读性降低,因此,目前该语句已经很少使用。1025.4.4return语句return语句将程序执行控制返回给该语句所在的函数成员的调用者。其语法格式为:
return表达式;return语句的表达式是可选的。不能在finally块中使用return语句。返回目录1031045.5.1条件编译 C#的条件编译主要依靠预处理指令:#if、#else、#elif和#endif,这四条预处理指令主要有以下四种基本组合方式:#if(判断条件)…#endif#if(判断条件)…#else…#endif#if(判断条件)…#elif(判断条件)…#endif#if(判断条件)…#elif(判断条件)…#else…#endif105C#语言使用#define来定义符号,其一般的定义形式为:
#define符号与#define相对应,#undef指令可以用来撤消定义的符号,其一般的定义形式为:
#undef符号#undef和#define必须放在所有其他非注释语句和非预处理指令语句的前面。1065.5.2报告编译错误和警告#warning是以编译警告的形式输出字符串,程序仍可被编译通过,其一般的使用格式为: #warning字符串#error是以编译错误的形式输出字符串,此时程序无法被成功编译,其一般的使用格式为: #error字符串#line指令允许改变编译器报告的错误或警告信息的内容,其一般的使用格式为: #line行号["文件名"] 1075.5.3定义代码块指令#region和#endregion用来指定需要采用扩展或者压缩方式显示的代码段,一般的使用格式如下:
#region字符串 代码块
#endregion#region和#endregion要配对使用,#region标识代码块的头,#endregion标识代码块的尾。返回目录108第6章类6.1面向对象程序设计
6.2类声明
6.3类成员
6.4类与结构6.5构造函数和析构函数6.6常量6.7字段6.8运算符重载1096.1.1面向对象程序设计的基本概念面向对象=对象+类+继承+通信(1)抽象(2)封装(3)继承(4)多态性1106.1.2类与对象1.对象(object)对象指的是一个实体的实例,在这个实体中包括了特定的属性数据和对这些数据进行操作的函数。封装性、继承性、多态性2.类(class)类是一组具有相同数据结构和相同操作的对象的集合。在一个类中,每个对象都是类的实例,可以使用类中提供的方法。创建类的对象的操作,被称为类的实例化。返回目录111一个类就是一个数据结构,可以包含数据成员(常量、字段和事件)、函数成员(方法、属性、下标指示器、操作符、构造函数和析构函数)和嵌套的类型。类声明语句声明一个新类,其语法格式为:
[特征][修饰符]class类名[:基类名和任何实现接口的列表] {
类体
}1126.2.1类修饰符C#支持的类修饰符有:new、public、protected、internal、private、abstract和sealed。类声明中的类修饰符可以是上面几种之一或是它们的组合。1.抽象类2.密封类1136.2.2类的基本规范如果类声明时指定了基类的类型,那么就表示指定了当前声明的类的直接基类。但是如果类在声明时没有指定基类,或者基类仅列出了一些接口类型,那么当前声明的类的基类假定为object。新派生的类必须可以访问其直接基类。程序员在定义新类时不能以下列类为基类:
System.Array、System.Delegate、System.Enum、System.ValueType返回目录1146.3.1类继承创建派生类要在派生类的名字后面加上冒号“:”,后面再跟上基类的名字。派生类继承了基类的所有成员,包括成员变量和方法。派生类可以选择是否自己重新实现基类方法,如需重新实现可以用关键字new修饰新方法,它表示派生类故意隐藏和替代了基类方法。115类继承有以下几点需要注意的:(1)如果一个类是从其他类派生的,那么该类也继承其直接基类的所有成员,但基类的构造函数和析构函数除外。(2)继承具有传递性。(3)派生类可以扩展它的基类。(4)基类的构造函数和析构函数不能被继承,但是可以继承的其他成员的存取权限可能会影响到成员在类中的访问。(5)派生类可以隐藏继承成员的实现。(6)对一个派生类实例的引用可以当成是对该类的基类实例的引用。(7)类可以声明虚方法、虚属性和虚下标指示器,并且派生类可以重载这些函数成员的实现,这样就使类的多态性得以实现。1166.3.2new修饰符派生类可以声明特定的成员类隐藏基类的相应成员,这种隐藏不是一种错误,但是编译器在编译阶段会给出警告。为了禁止此警告,派生类成员的声明可以包含new修饰符以指出该派生成员将隐藏基类成员。但是如果某派生类成员声明时并不是为了隐藏基类某成员,此时再加new修饰符就会引起编译警告。1176.3.3静态成员和实例成员1.静态成员 如果字段、方法、属性、事件、运算符或构造函数声明时指定了static修饰符,就等于声明了一个静态成员。另外,一个常量或类型声明时都隐式地声明了一个静态成员。2.实例成员 如果字段、方法、属性、事件、下标指示器、构造函数或析构函数声明时没有指定static修饰符,那么此时声明的是一个实例成员(也称为非静态成员)。1186.3.4嵌套类类都有成员,而类的成员是另一个用户定义类是完全可能的。被包含的内部类称为嵌套类(nestedclass),而包含它的类称为外层类(outerclass)。嵌套类可以对外层类的所有成员进行访问。嵌套类的方法可以访问外层类的私有成员。嵌套类可以对其他所有类隐藏。返回目录1196.4.1结构的定义和使用结构类型的一般定义形式为:
[特征][修饰符]struct结构名[:接口列表] {
结构体
}1206.4.2结构的嵌套和类一样,结构中可以包含其他数据类型,这其中也包括结构。1216.4.3结构和类的区别1.关于类型2.关于继承3.关于定义构造函数4.关于初始化5.关于创建对象的方法返回目录1226.5.1实例构造函数构造函数的定义格式为:[特征][修饰符]构造函数名(参数表)[:base([参数表])|:this([参数表])]{
代码}1231.缺省构造函数 如果一个C#类没有声明自己的构造函数,则编译器会自动建立一个缺省的构造函数。2.私有构造函数 如果一个类的构造函数仅有一个,并且声明为private类型,那么除了那些嵌套在该类中的类,该类不能作为其他类的基类,并且在程序中不能创建该类的实例。3.构造函数的参数 在带有参数的构造函数中,类在实例化时必须传递参数,否则该构造函数不被执行。1246.5.2静态构造函数当构造函数前有static修饰符时,该构造函数为静态构造函数。静态构造函数不能带有任何参数,且其定义前不能再出现其他任何修饰符。C#类的静态构造函数不能被显式调用,它是自动被调用的。1256.5.3析构函数析构函数的句法如下所示:[特征]~析构函数名(){
代码}返回目录126常量(constance)是一个类的成员,它代表一个不变的数值,该数值在程序编译时可以被计算。在C#中,类的常量成员声明句法如下所示:
[特征]常量修饰符const类型常量声明符;常量修饰符可以是new、public、protected、internal和private等类型。常量声明符为:常量成员标识符=常量表达式一条常量声明语句中可以同时声明多个常量。允许一个常量依赖同一个程序中的另一常量。返回目录127字段(field)是类的一个成员,它表示的是与对象或类相关的一个变量。字段的声明句法如下所示。
[特征]字段修饰符类型字段声明符;字段声明符如下: 标识符=字段初始表达式一条字段声明语句可以同时声明多个字段。1286.7.1字段类别1.实例字段和静态字段实例字段和静态字段也称为实例变量和静态变量。如果在声明字段时加上了static修饰符,那么表明该字段是一个静态字段;否则,该字段就是一个实例字段。静态字段与实例字段的最大区别就在于类的实例对字段的拷贝数目。1292.字段的访问在程序中程序员可以直接利用字段名,或以成员访问的形式E.M获得字段的数值。如果一个字段以一个成员访问的形式(E.M)引用时,如果M是一个静态字段,那么E必须指示的是一个类型;如果M是一个实例字段,那么E必须指示的是一个实例。1306.7.2只读字段当一个字段声明时包括一个readonly修饰符,那么表明该字段是一个只读型的。对于只读型字段来说,只能在该字段声明时,或在其所属类的构造函数中为其分配数值。1.为常量使用静态只读字段2.常量和静态只读字段的版本问题1316.7.3字段初始化1.字段缺省值如果字段在声明时未显示指定初始值,那么一个字段的初始值其实就是该字段声明时指定的类型的缺省值。在程序中,当一个类被装载时,它的所有静态字段就被初始化为它们的缺省值;当类的一个实例被创建时,它的所有实例字段就被初始化为它们的缺省值。1322.字段初始化表达式对一个静态字段来说,该初始化表达式对应于类被装载时将执行的那些赋值语句。对实例字段来说,该初始化表达式对应于创建类的实例时将被执行的那些语句。返回目录133运算符重载是指同名运算符可用于运算不同类型的数据。在C#中,不是所有的运算符都允许重载。1346.8.1一元运算符重载一元运算符+、-、!、~必须使用类型T的单个参数,但是可以返回任何类型。一元运算符++、--必须使用类型T的单个参数,并且要返回类型T。一元运算符true、false必须使用类型T的单个参数,并且要返回类型bool。这里T代表包含运算符声明的类或结构类型1356.8.2二元运算符重载一个二元运算符必须有两个参数,而且其中至少一个必须是声明运算符的类或结构的类型。一个二元运算符可以返回任何类型。二元运算符的签名由运算符符号和两个形式参数组成。某些二元运算符需要成对声明。1366.8.3转换运算符一个转换运算符声明定义了一个自定义转换。关键字implicit声明了一个用户自定义的隐式转换。关键字explicit声明了一个用户自定义的显式转换。转换运算符的签名由源类型和目标类型组成。返回目录137第7章方法7.1定义与调用方法
7.2方法参数
7.3静态方法
7.4方法重载7.5虚方法7.6抽象方法和外部方法1387.1.1定义方法方法的定义包括方法说明和方法体两大部分组成,其一般格式为:[特征][方法修饰符]返回类型方法名([形式参数表]){
方法体}形式参数表是由一个或多个下面的参数定义组成,参数之间用逗号分开。例如:
[特征][参数修饰符]类型参数名1397.1.2调用方法方法调用的一般形式为: 对象.方法名(实参表);//通过实例调用方法如果是在同一个类的内部调用方法,则不需要指定对象名,形式为: 方法名(实参表)调用方法和调用数据成员的区别是:调用方法时,不论是否有调用参数,方法名后必须跟括号。返回目录1407.2.1值参数值参数是不附加任何修饰符的参数。定义含有值类型参数方法的格式为:
[修饰符]返回的数据类型方法名(参数列表)传递的参数格式为:
[特征]参数的数据类型参数名
1417.2.2引用参数引用参数是以ref修饰符声明的参数。带引用参数的方法头格式为:
[修饰符]返回的数据类型方法名(参数列表)传递的参数格式为:
[特征]ref参数的数据类型参数名1427.2.3输出参数带输出参数的方法头格式为:
[修饰符]返回的数据类型方法名(参数列表)传递的参数格式为:
[特征]out参数的数据类型参数名1437.2.4数组参数数组参数是以params修饰符声明的参数。数组参数中的数组必须是一维数组类型,包括像int[]、string[][]等。带有关键字params的数组型参数必须是方法的参数列表中最后一个参数,否则会出现编译错误。返回目录1447.3.1静态方法的定义与调用静态方法的定义形式为:[修饰符]static返回的数据类型方法名(参数列表){
方法体}可以从Main方法内调用静态方法,其调用格式为: 类名.静态方法名(参数列表)1457.3.2访问类成员非静态方法可以访问类中的任何成员。而静态方法只能访问类中的静态成员,不能访问实例成员。返回目录146方法重载即在同一个类的内部可以定义同名的方法,但方法的参数表必须不同。方法的参数表由参数的个数、类型、定义顺序和修饰符共同确定,但仅仅是修饰符ref和out有差别的方法不能定义重载。对于重载方法,程序员应尽可能保证让它们执行相同的功能,返回目录1477.5.1多态性1.编译时的多态性编译时的多态性通过重载来实现。运行速度快。2.运行时的多态性运行时的多态性通过虚成员实现。高度灵活和抽象。多态性允许用户定义一个方法多次遍历类层次,以便在运行期间,根据使用的对象来调用该方法的合适版本。1487.5.2虚方法虚方法的定义形式为:virtual修饰符返回的数据类型方法名(参数表){
方法体}虚方法的重载形式为:override修饰符返回的数据类型方法名(参数表){
方法体}返回目录1497.6.1抽象方法当一个实例方法的声明包括一个abstract修饰符,这个方法就被称为是一个抽象方法。一个抽象方法同时也是一个虚方法。抽象方法只能在抽象类中声明,并且它的声明中不能包含static、virtual、override修饰符。1507.6.2外部方法当一个方法声明中包含extern修饰符时,这个方法就被称为一个外部方法。外部方法在外部执行,它不提供自己的方法实现,它的主体仅由分号组成。在外部方法的声明中不能包含有abstract修饰符。返回目录151第8章属性和索引器8.1属性
8.2索引器
1528.1.1属性的定义属性的定义形式为:或:1538.1.2属性访问器1.get访问器get访问器是一个不带参数的方法,它用于向外部返回属性成员的值。它的基本格式为:
[修饰符]get{访问体}get访问器必须以一条return语句结束,或者是一条异常抛出语句throw。1542.set访问器set访问器是一个带有单个参数并且返回类型为void类型的方法,它用于处理类外部的写入值,其中参数类型就是属性的类型。它的基本格式为:
[修饰符]set{访问体}set访问器带有一个特殊的关键字value。一个属性不一定需要既具备get访问器,又具备set访问器。1558.1.3静态属性如果属性在声明时指定了static修饰符,那么该属性就是一个静态属性,否则,该属性为一个实例属性。静态属性与特定的实例无关,而实例属性与类的特定实例相关。访问静态属性成员时,如果采用成员访问形式(E.M),那么E必须代表一个类型;以成员访问形式访问实例成员时,E必须代表一个实例。1568.1.4虚拟、重载和抽象对于一个非静态的属性,它的声明中可以包括virtual或者abstract修饰符,并且不要求每个访问器都是相同的。属性也具有多态性,可以在基类的属性定义前添加修饰符virtual,在派生类中重载属性的get或set访问器。一个派生类中属性的虚访问器可以重载基类中的对应访问器,一个重载属性并不是声明了一个新的属性,而只是实现了一个属性中的虚访问器。返回目录1578.2.1索引器的定义class类名{[特征][修饰符]类型this[索引参数表]{get{//代码体
}set{//代码体
}}}1588.2.2索引器的使用1.索引器的使用索引器的用法与数组大致相同。定义了一个索引器以后,就可以对对象使用方括号表示法([])来读、写对象中的值。2.索引器的重载用户可以自由选择字符串或其他类型做索引创建索引器。索引值可以重载,这样索引给定集合时,可以按用户需要使用整数值或字符串值。1593.多索引器的使用在同一个类中可以定义多个索引器。多索引器在使用时,依靠索引器的参数表进行区分。返回目录160第9章代表和事件9.1代表
9.2事件
1619.1.1代表的声明与使用代表是一种引用数据类型,其作用相当于C/C++语言中的函数指针。代表实际上是定义了一个派生于System.Delegate的类。使用代表的程序结构是:(1)声明一个代表。(2)代表的实例化。(3)使用代表。1621.代表的声明代表的声明格式为:[特征][修饰符]delegate返回类型代表名([参数表]);代表并不知道也不关心它所引用的对象类,任何对象都可以,只要方法的参数类型以及返回类型(即方法的签名)与代表中的类型相匹配即可。2.代表的实例化其格式为:
new代表名(表达式);其中,表达式可以是三种类型:静态方法、实例方法和其他的代表对象。1633.代表的调用代表对象的调用规则与直接使用它所封装的方法一致,代表对象名被当作是方法名使用,然后提供封装方法所需要的参数。4.代表的callback方法(回调方法)
callback方法用于许多目的,其中最常用的有:异步处理把用户代码放入一个类的代码路径中。1649.1.2多重代表多重代表(multicastdelegate)即通过一个代表调用两个或更多实现方法。任何返回值为void的代表都是多重代表。多重代表具有创建方法链表的能力。方法链表中的方法必须具有相同的参数,而且这些方法的返回类型必须定义为void。1659.1.3静态代表C#允许把代表定义为静态的类成员,以便在创建代表时使用。这个静态成员可以用于Main()方法,而无需用户对代表进行实例化。1669.1.4代表构成构成代表的能力(从多重代表创建出单个代表)在一开始的时候并不一定能让用户感到方便,但其实它是非常有用的。1679.1.5代表的异常处理如果在调用代表对象时,在某个方法中产生异常,且该方法没有进行异常处理,则可以由调用的代表对象的方法来处理。对于多重代表,在方法链表中某一个方法发生异常后将进行异常处理,并终止代表对象调用链表中后续方法的调用。返回目录1689.2.1事件的创建和使用C#语言创建和使用事件的步骤为:1.为事件创建一个代表为事件声明一个代表的语句格式为:delegatevoid代表名([触发事件的对象名,事件参数]);2.创建一个包含事件信息的类事件信息将作为事件参数发送给事件接收者。创建的这个类将包含事件处理方法需要的所有数据,这些数据以后将被传递给事件处理方法。1693.创建事件类(包含事件成员的类)可以创建一个引发事件的类,它包含事件的声明。事件声明的格式为:
[特征][修饰符]event代表名事件名;4.创建事件处理程序事件处理程序是一个代码片段,在事件被触发时,将通过该事件的代表来调用处理该事件的事件处理方法,处理事件的方法是用事件代表的格式创建的。1705.将事件处理程序和事件关联起来关联过程是在主程序中进行的。首先必须声明一个包含事件的对象。然后将事件处理程序和该对象关联起来,其格式如下:事件类对象名.事件类中定义的事件成员+=new事件代表名(事件处理方法名列表);1719.2.2事件访问器事件访问器的声明包括两种:添加(add)访问器声明和删除(remove)访问器声明,并在访问器声明之后跟随相关执行代码的语句块。在执行预订操作时使用添加访问器,在执行撤消操作时使用删除访问器。不管是哪种事件访问器,都对应相应的一个方法,这个方法只有一个事件类型的值参数,并且返回值为void。1729.2.3多重事件一个事件可以链接多个代表对象来响应事件信息,也可以为同一个事件指定多个事件处理程序(新加入的处理程序必须有同样的格式),此时可以使用“+=”或“-=”运算符。返回目录173第10章接口10.1类与接口
10.2接口的定义
10.3接口的实现
10.4接口的组合10.5接口的查询17410.1.1类与接口的比较接口类似于抽象类,但它与类之间的差别很大:接口不提供任何实现代码。接口只包含方法、属性、事件和索引器,而不包含数据成员、构造函数、析构函数,也不能包含静态成员。接口中的所有成员都被视为公有的。接口允许多重继承。17510.1.2使用接口的优势可以将接口作为一种给结构提供继承特性的途径。可以在一个类中实现多个接口,从而获得抽象类无法获得的功能。可以给类添加通过其他方法无法实现的特征。强制新的类实现接口定义的所有特征。返回目录17610.2.1定义接口接口定义的一般格式为:[特征][修饰符]interface接口名[:父接口表]{//接口成员定义体}17710.2.2接口成员接口可以声明零个或多个成员。一个接口的成员不止包括自身声明的成员,还包括从父接口继承的成员。1.接口方法成员声明接口的方法成员的格式为:[特征][new]返回类型方法名([参数表]);2.接口属性成员声明接口的属性成员的格式为:[特征][new]返回类型属性名{get;和|或set;};1783.接口索引器成员声明接口的索引器成员的格式为:
[特征][new]数据类型this[索引参数表]{get;和|或set;};4.接口事件成员声明接口的事件成员的格式为:
[特征][new]event代表名事件名;返回目录17910.3.1接口的实现接口实现的语句格式为:class类名:接口名列表{…//类实体}180(1)当一个类实现一个接口时,这个类就必须实现整个接口,而不能选择实现接口的某一部分。(2)一个接口可以由多个类来实现,而在一个类中也可以实现一个或多个接口。(3)一个类可以继承一个基类,并同时实现一个或多个接口。(4)在类中实现的接口成员必须定义为public。在类中实现的成员的数据类型也必须和它们在接口中声明的类型完全一样。18110.3.2显式接口成员实现当类实现接口时,如给出了接口成员的完整名称,则称这样实现的成员为显式接口成员,其实现被称为显式接口实现。显式接口成员实现不能使用任何修饰符。18210.3.3接口的重实现如果某个类可以再次实现已被它的基类实现的接口,则称之为接口的重实现。接口的重实现的方法是把接口的名称置于基类列表中。18310.3.4接口实现的继承一个类继承它的基类中所有接口的实现。如果没有显式的接口重复实现,一个派生类不能修改从基类继承的接口映射。返回目录184C#语言可以把两个或两个以上的接口组合在一起,这样一个类只需实现合并后的接口就可以了。使用组合接口的能力,不仅能够简单地把语义上相关的接口变成一个单个接口,而且还能在需要的时候,向新的“复合”接口添加方法。返回目录18510.5.1通过使用is实现查询用户可以使用is运算符检测运行时对象的类型是否与某一给定的类型兼容。使用形式为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年日报类单色印刷品行业商业模式创新分析研究报告
- 低盐蔬菜罐行业跨境出海战略分析报告
- 2025-2030年电子产业园行业跨境出海战略分析研究报告
- 粮油企业制定与实施新质生产力战略分析报告
- 开展学习竞赛激励机制细则
- 小学教导处心理健康教育计划
- 工程项目部管理人员劳动合同范本
- 压力开关校验、压力变送器校验方法
- GBT 23913.3-2026 复合岩棉板耐火舱室 第3部分:防火门标准立项发展报告
- 灵武市市级机关选调真题2025
- 2026 秋新人教版一年级上册小学数学核心素养教案
- 2026年秋季小学道德与法治二年级上册(新教材)教学计划含进度表
- 2026贵州黔南州贵定县综合行政执法局公开招聘协管员8人考试备考试题及答案详解
- 国家能源集团2026年秋招笔试题库
- 交期延误预警及处理流程
- 超龄劳动者用工合规与工伤保险实操指南
- 2026秋季人教版二年级上册道德与法治全册教案
- 2026 年秋季开学小学生安全教育第一课
- 九年级上册第六单元-整本书阅读《唐诗三百首》(课件)
- 结直肠癌肠造口患者居家管理专家共识总结2026
- 26新二(上)语文小纸条课课贴
评论
0/150
提交评论