关闭

关闭

关闭

封号提示

内容

首页 C#教程.pdf

C#教程.pdf

C#教程.pdf

上传者: chopper 2011-09-19 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《C#教程pdf》,可适用于IT/计算机领域,主题内容包含第一章C#C#C#C#语言基础本章介绍C#语言的基础知识希望具有C语言的读者能够基本掌握C#语言并以此为基础能够进一步学习用C#语言编写window符等。

第一章C#C#C#C#语言基础本章介绍C#语言的基础知识希望具有C语言的读者能够基本掌握C#语言并以此为基础能够进一步学习用C#语言编写window应用程序和Web应用程序。当然仅靠一章的内容就完全掌握C#语言是不可能的如需进一步学习C#语言还需要认真阅读有关C#语言的专著。(脚本之家wwwjbnet)C#C#C#C#语言特点语言特点语言特点语言特点MicrosoftNET(以下简称NET)框架是微软提出的新一代Web软件开发模型C#语言是NET框架中新一代的开发工具。C#语言是一种现代、面向对象的语言它简化了C语言在类、命名空间、方法重载和异常处理等方面的操作它摒弃了C的复杂性更易使用更少出错。它使用组件编程和VB一样容易使用。C#语法和C和JAVA语法非常相似如果读者用过C和JAVA学习C#语言应是比较轻松的。用C#语言编写的源程序必须用C#语言编译器将C#源程序编译为中间语言(MicroSoftIntermediateLanguage,MSIL)代码形成扩展名为exe或dll文件。中间语言代码不是CPU可执行的机器码在程序运行时必须由通用语言运行环境(CommonLanguageRuntimeCLR)中的既时编译器(JUSTINTimeJIT)将中间语言代码翻译为CPU可执行的机器码由CPU执行。CLR为C#语言中间语言代码运行提供了一种运行时环境C#语言的CLR和JAVA语言的虚拟机类似。这种执行方法使运行速度变慢但带来其它一些好处主要有:通用语言规范(CommonLanguageSpecificationCLS):NET系统包括如下语言:C#、C、VB、J#他们都遵守通用语言规范。任何遵守通用语言规范的语言源程序都可编译为相同的中间语言代码由CLR负责执行。只要为其它操作系统编制相应的CLR中间语言代码也可在其它系统中运行。自动内存管理:CLR内建垃圾收集器当变量实例的生命周期结束时垃圾收集器负责收回不被使用的实例占用的内存空间。不必象C和C语言用语句在堆中建立的实例必须用语句释放实例占用的内存空间。也就是说CLR具有自动内存管理功能。交叉语言处理:由于任何遵守通用语言规范的语言源程序都可编译为相同的中间语言代码不同语言设计的组件可以互相通用可以从其它语言定义的类派生出本语言的新类。由于中间语言代码由CLR负责执行因此异常处理方法是一致的这在调试一种语言调用另一种语言的子程序时显得特别方便。增加安全:C#语言不支持指针一切对内存的访问都必须通过对象的引用变量来实现只允许访问内存中允许访问的部分这就防止病毒程序使用非法指针访问私有成员。也避免指针的误操作产生的错误。CLR执行中间语言代码前要对中间语言代码的安全性完整性进行验证防止病毒对中间语言代码的修改。版本支持:系统中的组件或动态联接库可能要升级由于这些组件或动态联接库都要在注册表中注册由此可能带来一系列问题例如安装新程序时自动安装新组件替换旧组件有可能使某些必须使用旧组件才可以运行的程序使用新组件运行不了。在NET中这些组件或动态联接库不必在注册表中注册每个程序都可以使用自带的组件或动态联接库只要把这些组件或动态联接库放到运行程序所在文件夹的子文件夹bin中运行程序就自动使用在bin文件夹中的组件或动态联接库。由于不需要在注册表中注册软件的安装也变得容易了一般将运行程序及库文件拷贝到指定文件夹中就可以了。完全面向对象:不象C语言即支持面向过程程序设计又支持面向对象程序设计C#语言是完全面向对象的在C#中不再存在全局函数、全局变量所有的函数、变量和常量都必须定义在类中避免了命名冲突。C#语言不支持多重继承。编写控制编写控制编写控制编写控制台应用程序应用程序应用程序应用程序使用SDKSDKSDKSDK命令行工具编写控制台程序第一个程序总是非常简单的程序首先让用户通过键盘输入自己的名字然后程序在屏幕上打印一条欢迎信息。程序的代码是这样的:usingSystem导入命名空间。为C#语言新增解释方法解释到本行结束classWelcome类定义类的概念见下一节{*解释开始和C语言解释用法相同解释结束*staticvoidMain()主程序程序入口函数必须在一个类中定义{ConsoleWriteLine("请键入你的姓名:")控制台输出字符串ConsoleReadLine()从键盘读入数据输入回车结束ConsoleWriteLine("欢迎!")}}可以用任意一种文本编辑软件完成上述代码的编写然后把文件存盘假设文件名叫做welcomecsC#源文件是以cs作为文件的扩展名。和C语言相同C#语言是区分大小写的。高级语言总是依赖于许多在程序外部预定义的变量和函数。在C或C中这些定义一般放到头文件中用#include语句来导入这个头文件。而在C#语言中使用using语句导入名字空间usingSystem语句意义是导入System名字空间C#中的using语句的用途与C中#include语句的用途基本类似用于导入预定义的变量和函数这样在自己的程序中就可以自由地使用这些变量和函数。如果没有导入名字空间的话我们该怎么办呢?程序还能保持正确吗?答案是肯定的那样的话我们就必须把代码改写成下面的样子:classWelcome{staticvoidMain(){SystemConsoleWriteLine("请键入你的姓名:")SystemConsoleReadLine()SystemConsoleWriteLine("欢迎!")}}也就是在每个Console前加上一个前缀System这个小原点表示Console是作为System的成员而存在的。C#中抛弃了C和C中繁杂且极易出错的操作符象::和>等C#中的复合名字一律通过来连接。System是Net平台框架提供的最基本的名字空间之一有关名字空间的详细使用方法将在以后详细介绍这里只要学会怎样导入名字空间就足够了。程序的第二行classWelcome声明了一个类类的名字叫做Welcome。C#程序中每个变量或函数都必须属于一个类包括主函数Main()不能象C或C那样建立全局变量。C#语言程序总是从Main()方法开始执行一个程序中不允许出现两个或两个以上的Main()方法。请牢记C#中Main()方法必须被包含在一个类中Main第一个字母必须大写必须是一个静态方法也就是Main()方法必须使用static修饰。staticvoidMain()是类Welcome中定义的主函数。静态方法意义见以后章节。程序所完成的输入输出功能是通过Console类来完成的Console是在名字空间System中已经定义好的一个类。Console类有两个最基本的方法WriteLine和ReadLine。ReadLine表示从输入设备输入数据WriteLine则用于在输出设备上输出数据。如果在电脑上安装了VisualStudioNet则可以在集成开发环境中直接选择快捷键或菜单命令编译并执行源文件。如果您不具备这个条件那么至少需要安装MicrosoftNetFrameworkSDK这样才能够运行C#语言程序。MicrosoftNetFrameworkSDK中内置了C#的编译器cscexe下面让我们使用这个微软提供的命令行编译器对程序welcomecs进行编译。假设已经将welcomecs文件保存在d:Charp目录下启动命令行提示符在屏幕上输入一行命令:d:回车cdCharp回车键入命令:C:WINNTMicrosoftNETFrameworkvcscwelcomecs如果一切正常welcomecs文件将被编译编译后生成可执行文件Welcomeexe。可以在命令提示符窗口运行可执行文件Welcomeexe屏幕上出现一行字符提示您输入姓名:请键入你的姓名:输入任意字符并按下回车键屏幕将打印出欢迎信息:欢迎!注意和我们使用过的绝大多数编译器不同在C#中编译器只执行编译这个过程而在C和C中要经过编译和链接两个阶段。换而言之C#源文件并不被编译为目标文件obj而是直接生成可执行文件exe或动态链接库dllC#编译器中不需要包含链接器。使用VisualVisualVisualVisualStudioNetStudioNetStudioNetStudioNet建立控制台程序()运行VisualStudioNet程序出现如图A界面。()单击新建项目按钮出现如图B对话框。在项目类型(P)编辑框中选择VisualC#项目在模板(T)编辑框中选择控制台应用程序在名称(N)编辑框中键入e在位置(L)编辑框中键入D:csarp必须预先创建文件夹D:csarp。也可以单击浏览按钮在打开文件对话框中选择文件夹。单击确定按钮创建项目。出现如图C界面。编写一个应用程序可能包含多个文件才能生成可执行文件所有这些文件的集合叫做一个项目。()修改classcs文件如下有阴影部分是新增加的语句其余是集成环境自动生成的。usingSystemnamespacee{<summary>Class的摘要说明。<summary>classClass{<summary>应用程序的主入口点。<summary>STAThreadstaticvoidMain(stringargs){TODO:在此处添加代码以启动应用程序ConsoleWriteLine("请键入你的姓名:")ConsoleReadLine()ConsoleWriteLine("欢迎!")}}}()按CTRLF键运行程序如右图和节运行效果相同。屏幕上出现一行字符提示您输入姓名:请键入你的姓名:输入任意字符并按下回车键屏幕将打印出欢迎信息:欢迎!输入回车退出程序。图A图B图C(下载源码就到脚本之家:wwwjbnet)类的基本概念类的基本概念类的基本概念类的基本概念C#语言是一种现代、面向对象的语言。面向对象程序设计方法提出了一个全新的概念:类它的主要思想是将数据(数据成员)及处理这些数据的相应方法(函数成员)封装到类中类的实例则称为对象。这就是我们常说的封装性。类的基本概念类可以认为是对结构的扩充它和C中的结构最大的不同是:类中不但可以包括数据还包括处理这些数据的函数。类是对数据和处理数据的方法(函数)的封装。类是对某一类具有相同特性和行为的事物的描述。例如定义一个描述个人情况的类Person如下:usingSystemclassPerson类的定义class是保留字表示定义一个类Person是类名{privatestringname="张三"类的数据成员声明privateintage=private表示私有数据成员publicvoidDisplay()类的方法(函数)声明显示姓名和年龄{ConsoleWriteLine("姓名:{},年龄:{}",name,age)}publicvoidSetName(stringPersonName)修改姓名的方法(函数){name=PersonName}publicvoidSetAge(intPersonAge){age=PersonAge}}ConsoleWriteLine("姓名:{},年龄:{}",name,age)的意义是将第二个参数变量name变为字符串填到{}位置将第三个参数变量age变为字符串填到{}位置将第一个参数表示的字符串在显示器上输出。大家注意这里我们实际定义了一个新的数据类型为用户自己定义的数据类型是对个人的特性和行为的描述他的类型名为Person和intchar等一样为一种数据类型。用定义新数据类型Person类的方法把数据和处理数据的函数封装起来。类的声明格式如下:属性类修饰符class类名{类体}其中关键字class、类名和类体是必须的其它项是可选项。类修饰符包括new、public、protected、internal、private、abstract和sealed这些类修饰符以后介绍。类体用于定义类的成员。类成员的存取控制一般希望类中一些数据不被随意修改只能按指定方法修改既隐蔽一些数据。同样一些函数也不希望被其它类程序调用只能在类内部使用。如何解决这个问题呢?可用访问权限控制字常用的访问权限控制字如下:private(私有)public(公有)。在数据成员或函数成员前增加访问权限控制字可以指定该数据成员或函数成员的访问权限。私有数据成员只能被类内部的函数使用和修改私有函数成员只能被类内部的其它函数调用。类的公有函数成员可以被类的外部程序调用类的公有数据成员可以被类的外部程序直接使用修改。公有函数实际是一个类和外部通讯的接口外部函数通过调用公有函数按照预先设定好的方法修改类的私有成员。对于上述例子name和age是私有数据成员只能通过公有函数SetName()和SetAge()修改既它们只能按指定方法修改。这里再一次解释一下封装它有两个意义第一是把数据和处理数据的方法同时定义在类中。第二是用访问权限控制字使数据隐蔽。类的对象Person类仅是一个用户新定义的数据类型由它可以生成Person类的实例C#语言叫对象。用如下方法声明类的对象:PersonOnePerson=newPerson()此语句的意义是建立Person类对象返回对象地址赋值给Person类变量OnePerson。也可以分两步创建Person类的对象:PersonOnePersonOnePerson=newPerson()OnePerson虽然存储的是Person类对象地址但不是C中的指针不能象指针那样可以进行加减运算也不能转换为其它类型地址它是引用型变量只能引用(代表)Person对象具体意义参见以后章节。和C、C不同C#只能用此种方法生成类对象。在程序中可以用OnePerson方法名或OnePerson数据成员名访问对象的成员。例如:OnePersonDisplay(),公用数据成员也可以这样访问。注意C#语言中不包括C语言中的>符号。类的构造函数和析构函数在建立类的对象时需做一些初始化工作例如对数据成员初始化。这些可以用构造函数来完成。每当用new生成类的对象时自动调用类的构造函数。因此可以把初始化的工作放到构造函数中完成。构造函数和类名相同没有返回值。例如可以定义Person类的构造函数如下:publicPerson(stringName,intAge)类的构造函数函数名和类同名无返回值。{name=Nameage=Age}当用PersonOnePerson=newPerson(“张五”)语句生成Person类对象时将自动调用以上构造函数。请注意如何把参数传递给构造函数。变量和类的对象都有生命周期生命周期结束这些变量和对象就要被撤销。类的对象被撤销时将自动调用析构函数。一些善后工作可放在析构函数中完成。析构函数的名字为~类名无返回类型也无参数。Person类的析构函数为~Person()。C#中类析构函数不能显示地被调用它是被垃圾收集器撤销不被使用的对象时自动调用的。类的构造函数的重载在C#语言中同一个类中的函数如果函数名相同而参数类型或个数不同认为是不同的函数这叫函数重载。仅返回值不同不能看作不同的函数。这样可以在类定义中定义多个构造函数名字相同参数类型或个数不同。根据生成类的对象方法不同调用不同的构造函数。例如可以定义Person类没有参数的构造函数如下:publicPerson()类的构造函数函数名和类同名无返回值。{name="张三"age=}用语句PersonOnePerson=newPerson("李四",)生成对象时将调用有参数的构造函数而用语句PersonOnePerson=newPerson()生成对象时调用无参数的构造函数。由于析构函数无参数因此析构函数不能重载。使用PersonPersonPersonPerson类的完整的例子下边用一个完整的例子说明Person类的使用:(VisualStudioNet编译通过)usingSystemnamespacee定义以下代码所属命名空间意义见以后章节{classPerson{privateStringname="张三"类的数据成员声明privateintage=publicvoidDisplay()类的方法(函数)声明显示姓名和年龄{ConsoleWriteLine("姓名:{},年龄:{}",name,age)}publicvoidSetName(stringPersonName)指定修改姓名的方法(函数){name=PersonName}publicvoidSetAge(intPersonAge)指定修改年龄的方法(函数){age=PersonAge}publicPerson(stringName,intAge)构造函数,函数名和类同名,无返回值{name=Nameage=Age}publicPerson()类的构造函数重载{name="田七"age=}}classClass{staticvoidMain(stringargs){PersonOnePerson=newPerson("李四",)生成类的对象OnePersonDisplay()下句错误在其它类(Class类)中不能直接修改Person类中的私有成员。OnePersonname="王五"只能通过Person类中公有方法SetName修改Person类中的私有成员name。OnePersonSetName("王五")OnePersonSetAge()OnePersonDisplay()OnePerson=newPerson()OnePersonDisplay()}}}键入CTRLF运行后显示的效果是:姓名:李四,年龄:姓名:王五,年龄:姓名:田七,年龄:C#C#C#C#的数据类型的数据类型的数据类型的数据类型从大的方面来分C#语言的数据类型可以分为三种:值类型引用类型指针类型指针类型仅用于非安全代码中。本节重点讨论值类型和引用类型。值类型和引用类型区别在C#语言中值类型变量存储的是数据类型所代表的实际数据值类型变量的值(或实例)存储在栈(Stack)中赋值语句是传递变量的值。引用类型(例如类就是引用类型)的实例也叫对象不存在栈中而存储在可管理堆(ManagedHeap)中堆实际上是计算机系统中的空闲内存。引用类型变量的值存储在栈(Stack)中但存储的不是引用类型对象而是存储引用类型对象的引用即地址和指针所代表的地址不同引用所代表的地址不能被修改也不能转换为其它类型地址它是引用型变量只能引用指定类对象引用类型变量赋值语句是传递对象的地址。见下例:usingSystemclassMyClass类为引用类型{publicinta=}classTest{staticvoidMain(){f()}staticpublicvoidf(){intv=值类型变量v其值存储在栈(Stack)中intv=v将v的值(为)传递给vv=,v值不变。v=v=,v值不变。MyClassr=newMyClass()引用变量r存储MyClass类对象的地址MyClassr=rr和r都代表是同一个MyClass类对象ra=和语句ra=等价}}存储在栈中的变量当其生命周期结束自动被撤销例如v存储在栈中v和函数f同生命周期退出函数fv不存在了。但在堆中的对象不能自动被撤销。因此C和C语言在堆中建立的对象不使用时必须用语句释放对象占用的存储空间。NET系统CLR内建垃圾收集器当对象的引用变量被撤销表示对象的生命周期结束垃圾收集器负责收回不被使用的对象占用的存储空间。例如上例中引用变量r及r是MyClass类对象的引用存储在栈中退出函数fr和r都不存在了在堆中的MyClass类对象也就被垃圾收集器撤销。也就是说CLR具有自动内存管理功能。值类型变量分类C#语言值类型可以分为以下几种:简单类型(Simpletypes)简单类型中包括:数值类型和布尔类型(bool)。数值类型又细分为:整数类型、字符类型(char)、浮点数类型和十进制类型(decimal)。结构类型(Structtypes)枚举类型(Enumerationtypes)C#语言值类型变量无论如何定义总是值类型变量不会变为引用类型变量。结构类型结构类型和类一样可以声明构造函数、数据成员、方法、属性等。结构和类的最根本的区别是结构是值类型类是引用类型。和类不同结构不能从另外一个结构或者类派生本身也不能被继承因此不能定义抽象结构结构成员也不能被访问权限控制字protected修饰也不能用virtual和abstract修饰结构方法。在结构中不能定义析构函数。虽然结构不能从类和结构派生可是结构能够继承接口结构继承接口的方法和类继承接口的方法基本一致。下面例子定义一个点结构point:usingSystemstructpoint结构定义{publicintx,y结构中也可以声明构造函数和方法变量不能赋初值}classTest{staticvoidMain(){pointPPx=Py=pointPP=P值传递使Px=,Py=pointP=newpoint()用new生成结构变量PP仍为值类型变量}用new生成结构变量P仅表示调用默认构造函数使x=y==。}简单类型简单类型也是结构类型因此有构造函数、数据成员、方法、属性等因此下列语句inti=intMaxValuestrings=iToString()是正确的。即使一个常量C#也会生成结构类型的实例因此也可以使用结构类型的方法例如:strings=ToString()是正确的。简单类型包括:整数类型、字符类型、布尔类型、浮点数类型、十进制类型。见下表:保留字System命名空间中的名字字节数取值范围sbyteSystemSbyte~byteSystemByte~shortSystemInt~ushortSystemUInt~intSystemInt~uintSystemUInt~longSystemInt~ulongSystemUInt~charSystemChar~floatSystemSingleE~EdoubleSystemDoubleE~EboolSystemBoolean(true,false)decimalSystemDecimal正负到之间C#简单类型使用方法和C、C中相应的数据类型基本一致。需要注意的是:和C语言不同无论在何种系统中C#每种数据类型所占字节数是一定的。字符类型采用Unicode字符集一个Unicode标准字符长度为位。整数类型不能隐式被转换为字符类型(char)例如charc=是错误的必须写成:charc=(char)charc='A'charc='x'charc='u'。布尔类型有两个值:false,true。不能认为整数是false其它值是true。boolx=是错误的不存在这种写法只能写成x=true或x=false。十进制类型(decimal)也是浮点数类型只是精度比较高一般用于财政金融计算。枚举类型C#枚举类型使用方法和C、C中的枚举类型基本一致。见下例:usingSystemclassClass{enumDays{Sat=,Sun,Mon,Tue,Wed,Thu,Fri}使用VisualStudioNet,enum语句添加在STAThread前边staticvoidMain(stringargs){Daysday=DaysTueintx=(int)DaysTuex=ConsoleWriteLine("day={},x={}",day,x)显示结果为:day=Tue,x=}}在此枚举类型Days中每个元素的默认类型为int其中Sun=Mon=Tue=依此类推。也可以直接给枚举元素赋值。例如:enumDays{Sat=,Sun,Mon,Tue,Wed,Thu,Fri,Sat}在此枚举中Sun=Mon=Tue=Wed=等等。和C、C中不同C#枚举元素类型可以是byte、sbyte、short、ushort、int、uint、long和ulong类型但不能是char类型。见下例:enumDays:byte{Sun,Mon,Tue,Wed,Thu,Fri,Sat}元素为字节类型值类型的初值和默认构造函数所有变量都要求必须有初值如没有赋值采用默认值。对于简单类型sbyte、byte、short、ushort、int、uint、long和ulong默认值为char类型默认值是(char)float为fdouble为ddecimal为mbool为false枚举类型为在结构类型和类中数据成员的数值类型变量设置为默认值引用类型变量设置为。可以显示的赋值例如inti=。而对于复杂结构类型其中的每个数据成员都按此种方法赋值显得过于麻烦。由于数值类型都是结构类型可用new语句调用其构造函数初始化数值类型变量例如:intj=newint()。请注意用new语句并不是把int变量变为引用变量j仍是值类型变量这里new仅仅是调用其构造函数。所有的数值类型都有默认的无参数的构造函数其功能就是为该数值类型赋初值为默认值。对于自定义结构类型由于已有默认的无参数的构造函数不能再定义无参数的构造函数但可以定义有参数的构造函数。引用类型分类C#语言中引用类型可以分为以下几种:类:C#语言中预定义了一些类:对象类(object类)、数组类、字符串类等。当然程序员可以定义其它类。接口。代表。C#语言引用类型变量无论如何定义总是引用类型变量不会变为值类型变量。C#语言引用类型对象一般用运算符new建立用引用类型变量引用该对象。本节仅介绍对象类型(object类型)、字符串类型、数组。其它类型在其它节中介绍。对象类(object(object(object(object类))))C#中的所有类型(包括数值类型)都直接或间接地以object类为基类。对象类(object类)是所有其它类的基类。任何一个类定义如果不指定基类默认object为基类。继承和基类的概念见以后章节。C#语言规定基类的引用变量可以引用派生类的对象(注意派生类的引用变量不可以引用基类的对象)因此对一个object的变量可以赋予任何类型的值:intx=objectobjobj=xobjectobj='A'object关键字是在命名空间System中定义的是类SystemObject的别名。数组类在进行批量处理数据的时候要用到数组。数组是一组类型相同的有序数据。数组按照数组名、数据元素的类型和维数来进行描述。C#语言中数组是类SystemArray类对象比如声明一个整型数数组:intarr=newint实际上生成了一个数组类对象arr是这个对象的引用(地址)。在C#中数组可以是一维的也可以是多维的同样也支持数组的数组即数组的元素还是数组。一维数组最为普遍用的也最多。我们先看一个一维数组的例子:usingSystemclassTest{staticvoidMain(){intarr=newint用new运算符建立一个个元素的一维数组for(inti=i<arrLengthi)arrLength是数组类变量表示数组元素个数arri=i*i数组元素赋初值arri表示第i个元素的值for(inti=i<arrLengthi)数组第一个元素的下标为ConsoleWriteLine("arr{}={}",i,arri)}}这个程序创建了一个int类型个元素的一维数组初始化后逐项输出。其中arrLength表示数组元素的个数。注意数组定义不能写为C语言格式:intarr。程序的输出为:arr=arr=arr=上面的例子中使用的是一维数组下面介绍多维数组:stringa一维string数组类引用变量astring,a二维string数组类引用变量aa=newstring,a,="abc"string,,a三维string数组类引用变量astringj数组的数组即数组的元素还是数组stringj在数组声明的时候可以对数组元素进行赋值。看下面的例子:inta=newint{,,}一维数组有个元素。inta=newint{,,}此格式也正确inta={,,}相当于inta=newint{,,}int,a=newint,{{,,},{,,}}二维数组a,=intj=newint定义数组j,有三个元素每个元素都是一个数组j=newint{,,}定义第一个元素是一个数组j=newint{,,,,,}每个元素的数组可以不等长j=newint{,,,,,,,,}字符串类((((stringstringstringstring类))))C#还定义了一个基本的类string专门用于对字符串的操作。这个类也是在名字空间System中定义的是类SystemString的别名。字符串应用非常广泛在string类的定义中封装了许多方法下面的一些语句展示了string类的一些典型用法:字符串定义strings定义一个字符串引用类型变量ss="Zhang"字符串引用类型变量s指向字符串"Zhang"stringFirstName="Ming"stringLastName="Zhang"stringName=FirstName""LastName运算符已被重载stringSameName=Namechars={'计','算','机','科','学'}strings=newString(s)字符串搜索strings="ABC科学"inti=sIndexOf("科")搜索"科"在字符串中的位置因第一个字符索引为所以"A"索引为"科"索引为因此这里i=如没有此字符串i=。注意C#中ASCII和汉字都用字节表示。字符串比较函数strings="abc"strings="abc"intn=stringCompare(s,s)n=n=表示两个字符串相同n小于零s<sn大于零s>s。此方法区分大小写。也可用如下办法比较字符串:strings="abc"strings="abc"strings="不相同"if(s==s)还可用!=。虽然String是引用类型但这里比较两个字符串的值s="相同"判断是否为空字符串strings=""strings="不空"if(sLength==)s="空"得到子字符串或字符strings="取子字符串"stringsb=sSubstring(,)从索引为开始取个字符Sb="字符",s内容不变charsb=ssb='取'ConsoleWriteLine(sb)显示:取字符串删除函数strings="取子字符串"stringsb=sRemove(,)从索引为开始删除个字符Sb="字符串",s内容不变插入字符串strings="计算机科学"strings=sInsert(,"软件")s="计算机软件科学"s内容不变字符串替换函数strings="计算机科学"strings=sReplace("计算机","软件")s="软件科学"s内容不变把String转换为字符数组stringS="计算机科学"chars=SToCharArray(,SLength)属性Length为字符类对象的长度其它数据类型转换为字符串inti=strings=iToString()s=""floatn=fstrings=nToString()s=""其它数据类型都可用此方法转换为字符类对象大小写转换strings="AaBbCc"strings=sToLower()把字符转换为小写s内容不变strings=sToUpper()把字符转换为大写s内容不变删除所有的空格strings="Abc"sTrim()删除所有的空格string类其它方法的使用请用帮助系统查看,方法是打开VisualStudioNet的代码编辑器键入string将光标移到键入的字符串string上然后按F键。类型转换在编写C#语言程序中经常会碰到类型转换问题。例如整型数和浮点数相加C#会进行隐式转换。详细记住那些类型数据可以转换为其它类型数据是不可能的也是不必要的。程序员应记住类型转换的一些基本原则编译器在转换发生问题时会给出提示。C#语言中类型转换分为:隐式转换、显示转换、加框(boxing)和消框(unboxing)等三种。一.隐式转换隐式转换就是系统默认的、不需要加以声明就可以进行的转换。例如从int类型转换到long类型就是一种隐式转换。在隐式转换过程中转换一般不会失败转换过程中也不会导致信息丢失。例如:inti=longl=i二.显示转换显式类型转换又叫强制类型转换。与隐式转换正好相反显式转换需要明确地指定转换类型显示转换可能导致信息丢失。下面的例子把长整形变量显式转换为整型:longl=inti=(int)l如果超过int取值范围将产生异常三.加框(boxing)和消框(unboxing)加框(boxing)和消框(unboxing)是C#语言类型系统提出的核心概念加框是值类型转换为object(对象)类型消框是object(对象)类型转换为值类型。有了加框和消框的概念对任何类型的变量来说最终我们都可以看作是object类型。加框操作把一个值类型变量加框也就是创建一个object对象并将这个值类型变量的值复制给这个object对象。例如:inti=objectobj=i隐式加框操作obj为创建的object对象的引用。我们也可以用显式的方法来进行加框操作例如:inti=objectobj=object(i)显式加框操作值类型的值加框后值类型变量的值不变仅将这个值类型变量的值复制给这个object对象。我们看一下下面的程序:usingSystemclassTest{publicstaticvoidMain(){intn=objecto=no=不能改变nConsoleWriteLine("{},{}",n,o)}}输出结果为:。这就证明了值类型变量n和object类对象o都独立存在着。消框操作和加框操作正好相反消框操作是指将一个对象类型显式地转换成一个值类型。消框的过程分为两步:首先检查这个object对象看它是否为给定的值类型的加框值如是把这个对象的值拷贝给值类型的变量。我们举个例子来看看一个对象消框的过程:inti=objectobj=iintj=(int)obj消框操作可以看出消框过程正好是加框过程的逆过程必须注意加框操作和消框操作必须遵循类型兼容的原则。加框和消框的使用定义如下函数:voidDisplay(Objecto)注意o为Object类型{intx=(int)o消框SystemConsoleWriteLine("{},{}",x,o)}调用此函数:inty=Display(y)在此利用了加框概念虚参被实参替换:Objecto=y也就是说函数的参数是Object类型可以将任意类型实参传递给函数。运算符运算符运算符运算符C#语言和C语言的运算符用法基本一致。以下重点讲解二者之间不一致部分。运算符分类与C语言一样如果按照运算符所作用的操作数个数来分C#语言的运算符可以分为以下几种类型:一元运算符:一元运算符作用于一个操作数例如:X、X、X等。二元运算符:二元运算符对两个操作数进行运算例如:xy。三元运算符:三元运算符只有一个:xy:z。C#语言运算符的详细分类及操作符从高到低的优先级顺序见下表。类别操作符初级操作符(x)xyf(x)axxxnewtypeofsizeofcheckedunchecked一元操作符!~x–x(T)x乘除操作符*加减操作符移位操作符<<>>关系操作符<><=>=isas等式操作符==!=逻辑与操作符逻辑异或操作符^逻辑或操作符|条件与操作符条件或操作符||条件操作符:赋值操作符=*=====<<=>>==^=|=测试运算符isisisisis操作符用于动态地检查表达式是否为指定类型。使用格式为:eisT其中e是一个表达式T是一个类型该式判断e是否为T类型返回值是一个布尔值。例子:usingSystemclassTest{publicstaticvoidMain(){ConsoleWriteLine(isint)ConsoleWriteLine(isfloat)ConsoleWriteLine(fisfloat)ConsoleWriteLine(disdouble)}}输出为:TrueFalseTrueTruetypeoftypeoftypeoftypeof运算符typeof操作符用于获得指定类型在system名字空间中定义的类型名字例如:usingSystemclassTest{staticvoidMain(){ConsoleWriteLine(typeof(int))ConsoleWriteLine(typeof(SystemInt))ConsoleWriteLine(typeof(string))ConsoleWriteLine(typeof(double))}}产生如下输出由输出可知int和Systemint是同一类型。SystemIntSystemIntSystemStringSystemDouble溢出检查操作符checkedcheckedcheckedchecked和uncheckeduncheckeduncheckedunchecked在进行整型算术运算(如、、*、等)或从一种整型显式转换到另一种整型时有可能出现运算结果超出这个结果所属类型值域的情况这种情况称之为溢出。整型算术运算表达式可以用checked或unchecked溢出检查操作符决定在编译和运行时是否对表达式溢出进行检查。如果表达式不使用溢出检查操作符或使用了checked操作符常量表达式溢出在编译时将产生错误表达式中包含变量程序运行时执行该表达式产生溢出将产生异常提示信息。而使用了unchecked操作符的表达式语句即使表达式产生溢出编译和运行时都不会产生错误提示。但这往往会出现一些不可预期的结果所以使用unchecked操作符要小心。下面的例子说明了checked和unchecked操作符的用法:usingSystemclassClass{staticvoidMain(stringargs){constintx=intMaxValueunchecked不检查溢出{intz=x*编译时不产生编译错误z=ConsoleWriteLine("z={}",z)显示}checked检查溢出{intz=(x*)编译时会产生编译错误ConsoleWriteLine("z={}",z)}}}newnewnewnew运算符new操作符可以创建值类型变量、引用类型对象同时自动调用构造函数。例如:intx=newint()用new创建整型变量x调用默认构造函数PersonC=newPerson()用new建立的Person类对象。Person变量C对象的引用intarr=newint数组也是类创建数组类对象arr是

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/49
仅支持在线阅读

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部