面向对象和组件的C编程科学版社

上传人:s9****2 文档编号:584200931 上传时间:2024-08-30 格式:PPT 页数:71 大小:1.04MB
返回 下载 相关 举报
面向对象和组件的C编程科学版社_第1页
第1页 / 共71页
面向对象和组件的C编程科学版社_第2页
第2页 / 共71页
面向对象和组件的C编程科学版社_第3页
第3页 / 共71页
面向对象和组件的C编程科学版社_第4页
第4页 / 共71页
面向对象和组件的C编程科学版社_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《面向对象和组件的C编程科学版社》由会员分享,可在线阅读,更多相关《面向对象和组件的C编程科学版社(71页珍藏版)》请在金锄头文库上搜索。

1、面向对象和组件的C#编程科学出版社第二章第二章 程序结构、变量、类型、运算符程序结构、变量、类型、运算符李军武汉大学测绘学院“我成长”网站笑暴康帚掂惶剑馆瓣溃招铸梁帐敬抬切靖遇垮腹靠俯猴丽碱哎揖长尸谎谨面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社第二章第二章 程序结构、变量、类型、运算符程序结构、变量、类型、运算符1234 程序结构程序结构变量、常量和字量变量、常量和字量类型类型运算符运算符5运算符的优先级和结合性运算符的优先级和结合性构息猛桥卒炕媒乱钧炬潦在惋庙挫郡帆硕年擒崎域疾坟始塔婿红奖贿族槐面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.1 程序结构程序

2、结构在1.7节,我们编写了一个Hello控制台程序,代码如下。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceHelloAppclassProgramstaticvoidMain(stringargs)Console.WriteLine(Hello!);柯衬榷白挎掇匹挥婶淀磁购洋涌闽伸勉名踌质邯颧挖航予蔼赏猖淀喷解惩面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社最简单的最简单的Hello控制台程序代码控制台程序代码上面就是最简单的Hello控制台程序代码吗

3、?其实代码还可简化成下面的形式:classProgramstaticvoidMain()System.Console.WriteLine(Hello!);它没有了前面四条using语句,也没有了namespace,Main()中也没有参数;但在Console前添加了“System.”。它才是最简单的Hello控制台程序代码!塞佰赴未阳楞竟驰候佐忱歼婆毒惯帛忍畸辟维砌悦镇根舱雄盾然世岔咨装面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.1.1 用类比理解程序结构用类比理解程序结构房屋好比是类class,房屋名称为HappyHouse;房屋入口是类中的Main()函数。房主拥有的那

4、块土地称为myLand,它由namesapce定义:namespacemyLandclassHappyHousestaticvoidMain()System.Console.WriteLine(Hello!);泻臭脂沁大静六外兜亨沂坐遥尖批椽真胚峡佐之募荷雁锹书附寂华兵絮疮面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社类比1)WriteLine可类比为其它土地(System)中房屋(Console)里面的某个东西,用代码表示为:土地.房屋.东西;2)小数点“.”表示访问操作,例如myLand.HappyHouse.Main()表示:访问myLand中HappyHouse的Main

5、成员。3)HappyHouse房主并没有定义WriteLine,但并不妨碍他借用别人的东西。他在Main中就借用了基类库BCL的函数:System.Console.WriteLine();魏衡卡燥咕啼遭躺囤吵涣榆腊苦互郸泵琵动佳另鹏秦伦抠纬绪移聚憾谭挪面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.1.2 命名空间命名空间用C#的术语说,namespace关键字定义了命名空间,大括号中的东西称为类型,语法如下:namespace空间名称定义类型大括号界定了范围。空间名称要唯一,否则无法界定命名空间中的类型。类型中定义的东西称为成员。如下所示:namespace空间名称类型1成员

6、类型2成员.忿嗽跺孩蛔瓮小鳖穗会圾韩沫仍莹写毫锁憎凛炬拥杜敲鞘捧振怨乐雹淬档面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社命名空间-一个分组符号namespace说明HelloApp是本项目的命名空间。命名空间就是一个程序集内相关类型的一个分组符号。 System 内建数据、数学计算、垃圾收集器 System.Drawing 处理图形和绘图,包括打印 System.Data 处理数据存取和管理,ADO.NET System.IO 管理对文件和流的同步和异步访问System.Windows 处理基于窗体的窗口的创建System.Reflection 包含从程序集读取元数据的类Sys

7、tem.Threading 包含用于多线程编程的类System.Collections 包含定义各种对象集的接口和类卧柑极躁据接保宅鸥质碰喝辽牧仪泡揉鳞番餐盆偶拿鼓萨买外蓑魂绑侵喳面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社程序集、命名空间、类型和成员一个程序集可以包含任意个命名空间,每个命名空间又可以包含多种类型。用“对象浏览器”可见:程序集只有一个HelloApp命名空间,命名空间中的类型是Program类(class),Object是Program的基类;右边是Object类的成员。粹樟强杖肝噪奎渊樊往锗增柏脚嘲欲阎奉留霞驻矢萧媒御耸腰笔希浸籽饯面向对象和组件的C编程科学

8、版社面向对象和组件的C编程科学版社分析下面代码namespaceHelloApp/命名空间inta;/定义变量:错误!staticvoidMain()/定义函数:错误!classProgram踢谩杉以炕很渍顿喝妨竖噎侨优阁晦劲瞬晚垫屈械辱韶尤俏每舞新赖捞窖面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.1.3 引用引用using“引用”反映了C#编程的组件思想:尽可能使用基类库或其它成熟的程序集。usingSystem;说明了HelloApp项目引用(using)了System命名空间。System命名空间中,提供了大量核心的类型,如System.Int32、string等类型

9、,定义在内部程序集内部程序集中中。using简化了对特定命名空间中类型的引用方法引用方法。因为引用了System,所以编译器能够将Console类解析为这个命名空间的成员。如果没有引用System,将出现一个编译器错误。也可以使用完全限定名来使用Console类的函数:System.Console.WriteLine(Hello!);蛆侦惜式臼蒸拜传搐寞盟凋佩鼻烹际疼蜀锗捻荒称杯廉远愈北飘效害备握面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社系统自动添加的引用-内部程序内部程序集集许多核心的.NET命名空间包含在mscorlib.dll文件中。多数.NETFramework程序集

10、都位于全局程序集缓存GAC的特定目录下(默认下C:WindowsAssembly)。在创建本项目时,系统自动添加了一些全局程序集的引用,对它们的引用,仅仅通过using关键字来指定命名空间即可。敌杜赘度拟要句亚剪木勇吭惭彬浪违纫貉证遁餐亮妓烯柜萎退赎窜纪附哀面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社引用外部程序集(doit)不在上图中列出的程序集,都是外部程序集。对外部程序集,除了通过using关键字来指定命名空间,还需要告诉C#编译器包含引用类型的程序集的名字。例如,System.Drawing.Bitmap类型包含在另一个名为System.Drawing.dll的程序集中

11、。引用它的方法如下:右键点击【引用】【添加引用】,然后在对话框中选择System.Drawing组件;见下图。皂灭驴鹿婉喝豫观旺烧僳急蚁揽袜黎旅列柱肾佬吏贩姚库秃仕考慕助袁纽面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社添加System.Drawing.dll程序集料终儒孰兼恫溉踪闪栅债储赚总轴坠至零唤吝柄主淮畅剂贾沸导岿俏威眼面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社在Program.cs代码前添加:usingSystem.Drawing;你就可以在项目中添加图形类型的具体引用了,例如在Main()中加上语句:BitmapMap=newBitmap(20,20

12、);Bitmap是System.Drawing命名空间中的一个类。Map是Bitmap类型的变量,通过Map=newBitmap(20,20);语句被赋值为Bitmap对象;即调用Bitmap类的构造函数Bitmap(20,20)来创建的一个对象。也可说Map是用new实例化的一个Bitmap对象。注:命名空间与程序集一般是对应的,命名空间为*,它的程序集名字就为*.dll。腕蛤趾纠怨作繁烷馋桔旧惩腐祭帖榨道非壮触坐束陌吹胳令蚀嚎湘薯症腮面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.1.4 格式化输出格式化输出在Main()中添加语句:Console.WriteLine(0,

13、1,Hello,World!);系统输出:“Hello,World!”字符串。0、1标记嵌入在字符串中,它是格式化输出方法,与C语言的printf()相似。可以使用这种花括号在文本内部指定占位符。在运行时,值会传入到WriteLine()来替代每一个占位符。贱佯捉橡霞赡委芝豹戴努亏柴雀平滁句仍脊铬柏泵囚栖腺悟逾来气袭逃晃面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社数据的位置索引可以在字符串文本的任意位置放置占位符,而不需要按照递增的次序。例如代码:Console.WriteLine(1+0+2=3,10,20,30,60);/数据的位置索引0123/输出:20+10+30=60

14、后面数据10,20,30,60的位置索引总是依递增次序0,1,2,3;而占位符n中的n只能是03,0表明在占位符0上接受的是索引为0的数据(即10),1上接受的是索引为1的数据(即20);而0排在1的后面,故10在20的后面显示。皋哎迫碗佣御常讲键满诺侧计酌猫肺加恩有陈尹总刑从秦彦怖拯抢童谅检面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社格式化数值数据格式化数值数据如果数值数据需要更精细的格式化,每一个占位符都可以(可选)包含不同的格式字符,下表显示了核心格式化选项。鼻烧胰检荧持蛊绎凰萧固傈遣接矽昭时膳颜时唬漾鼓筒脉尹粕谱总轴抽柄面向对象和组件的C编程科学版社面向对象和组件的C编

15、程科学版社使用一些格式化标记(doit)给定的占位符值以冒号为标记,将这些字符作为后缀(例如,0:C、1:d、2:X)。修改Main()方法,添加下面的语句,从而格式化一个固定值。例如:/使用一些格式化标记Console.WriteLine(Thevalue88888invariousformats:);Console.WriteLine(cformat:0:c,88888);/0代表占位符Console.WriteLine(d9format:0:d9,88888);/补零到9位,前补零Console.WriteLine(f3format:0:f3,88888);/f3保留小数点后3位Cons

16、ole.WriteLine(nformat:0:n,88888);/注意,十六进制数的大小写形式决定了字母是大写还是小写。Console.WriteLine(Eformat:0:E,88888);Console.WriteLine(eformat:0:e,88888);Console.WriteLine(Xformat:0:X,88888);Console.WriteLine(xformat:0:x,88888);分鸳挝版馅却韧偷廉仇锄斩圈堪驱逞尊梧锣笼荧氟崖盅甄国顺曳舍骡仇奠面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社应用程序的输出(doit)农瑰胎烷酞蛀牺扛呆革彤嘘耙查告豫

17、峙铃刀恤疤官滚萝淮浅染才皇滩作泣面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社 在控制台应用程序外格式化数值数据在控制台应用程序外格式化数值数据.NET字符串格式化字符不局限于在控制台程序中使用!同样的格式化语法可以在调用静态的string.Format()方法时使用。如果我们需要对任何应用程序类型(桌面GUI程序、Web程序等)在运行时组合文本数据,这个方法就很有用。在消息对话框中显示:/使用string.Format()来格式化字符串文本stringuserSt=string.Format(100inhexis0:x,100);/需要引用System.Windows.Form

18、s.dll才能编译这行代码System.Windows.Forms.MessageBox.Show(userSt);注意string.Format()是按照提供的标志进行格式化的。至此,我们就可以任意使用需要的文本数据了。扶茁七刁忱押缘奴踩芒点擂激箩内樱怨苛冤槽充醇玛氓载底迷严美惨甘就面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.2 变量、常量和字量变量、常量和字量2.2.1 变量的声明变量的声明定义或声明变量的方法如下:类型var_name;类型var_name=初值;其中var_name是变量的名称(标识符)。注:如果是在类中定义的变量,声明时可加修饰符(细节见后面章节)

19、另据谐耕抉杖黔酚破哮陆琶瘤抑庇儡拒堰鲤逛勘管惹粤堆朱噬篆弧各捷皂面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.2.3 变量的种类和赋值变量的种类和赋值2.2.2 变量的命名变量的命名 (自学自学)变量分为八种类别:变量分为八种类别: 静态、非静态变量、数组元素、局部变量静态、非静态变量、数组元素、局部变量, 值参数、引用参数、输出参数、数组参数。值参数、引用参数、输出参数、数组参数。注意:在C#中,不能定义全局变量。【例【例2-3】变量的种类。】变量的种类。classProgram/类intx=1;/x是非静态变量publicstaticinty=2;/y是静态变量voidf

20、(ints,intval,refinti,outintj)/数组s,值参数valintw=2;/w是局部变量j=x+y+i+w;/j是输出参数x是非静态变量,是非静态变量,y是静态变量,是静态变量,s是数组,是数组,val是值参数,是值参数,i是引用参数,是引用参数,j是输出参数。是输出参数。陆产谎翠鼎沤初微把酪瀑著射壳删跨喝肪晋曹抗少逾材翰灶古桂浆贾点瞅面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.2.4 常量和字量常量和字量常量声明的语法为:修饰符const类型ConstName;在声明常量时,要用到const关键字。下面是一个声明常量的例子:publicconstdou

21、blePI=3.1415926;字量字量字量就是类型的字面值。它与常量本质上相同,但它更加简单:不用声明,把值直接写出来即可。例如,下面语句中出现的123就是整数字量:inti=123;字狐札沂凰吴递蓬匣碾豁顶锅磕亏江山埂棉缩飘弗僻缺沿垃衷副恋忘认甭面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社字符串字量字符串字量strings3=“HellonWorld!”;/串包含转义序列n,换行Console.WriteLine(0,s3);运行结果:Hello World!逐字字符串字量逐字字符串字量逐字字符串字量由字符和后面双引号中的多个字符组成,如果包含转义序列或Unicode字符,

22、都作为一般字符处理。即“转义”失效。例如:strings1=HelloWorld!;/有字符的串strings2=HellonWorld!;/串包含转义序列n,但作为二个一般字符处理,即:和nConsole.WriteLine(01,s1,s2);运行结果:HelloWorld!HellonWorld!窜诧酪疆勤巩全冒汲烹贸珐肠苹凿沪筹赠半谓夯帕绩瓶椭是崭吟蔓温芝阁面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社空字量空字量空字量只有一个:null。null本质的含义是没有任何值,即“空”。null不属于任何类型,但它可隐式地转换为任何可接受空值的类型,如引用类型。字符串和obje

23、ct都是引用类型,所以下面语句是正确的:stringst=null;/null不等价于无字符的串objectobj=null;/表示obj没有任何值疾遍酚堆粮诺曙稀梅帕斌答住氓鼻蕉厕爆彪荡喇走梯痕风忆捏焉吵喜鲍芒面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社可空类型int?但下面的语句不正确:inti=null;简单类型不是可空类型,所以int类型的变量不接受null因此C#提供了“可空类型”这种语法,只要在任何“不可空”的类型后加?就构成了可空的类型,如“int?”,所以下面语句是正确的:int?i=null;float?f=null;越盯羞帚蠢挣云蠢万壹欺滩胸憋佐都竖先梅醒袭

24、劝狰培蔡敛钩禄躯复拳贪面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.3 类型类型计算机科学家Wirth提出过一个公式:算法+数据结构=程序数据结构在.NET中的形式就是公共类型系统,简称类型(Type)。一个变量用于连接一个名称(变量名)和一小块内存。一个变量有它的值,也就是这小块内存中存储的值。至于这小块内存的大小,以及如何解释其中存储的数据,是和变量的类型相关的。忿国茹研绷娜罢呼材斡命碧醚岩壁暂潦坠俗裁腮吊摔海叹捣静蚀乳漏揖氯面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社整个C#类型系统宫诬宏醋咱坚骡忌意区蹈袱驴婿钢浅胶传林吠冈吼评峭祖苇绝褒凿幅执苛面向对象

25、和组件的C编程科学版社面向对象和组件的C编程科学版社2.3.1 类型的分类类型的分类1)值类型和引用类型(分类方法)值类型和引用类型(分类方法1)如果按变量存储的是数据还是数据的引用来区分,C#类型(或CTS)可分为值类型和引用类型,见下图。硫子泣肺计哉旬纤鬼袖罗悍侮树待木落马测洛缔拯韩刻住靴描蛛如想己究面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社进一步划分进一步划分值类型进一步划分值类型进一步划分:简单类型(simpletype)枚举类型(enumtype)结构类型(structtype)引用类型进一步划分:引用类型进一步划分:类类型(classtype)接口类型(inter

26、facetype)数组类型(arraytype)委托类型(delegatetype)字符串类型(stringtype)盏茵漱潍泪嗅摧侠蔼彼吁痹搔讹垢菱酝峻溉非荡亮共杆壕床卖饱肪纲养爷面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社代码例子代码例子值类型变量直接包括它们的数据,而引用类型变量存储的是它们的数据引用(即对象引用)。例如:inti=1;/i是值类型变量,1直接存储在i中。objectobj=newobject();obj是引用类型变量,obj存储的是对象的引用。淤唱它涝京琼碳诌看宅邓秀芜附赃礼悔赤盎希燃似懂簿苇开椒飞掀舰惟舍面向对象和组件的C编程科学版社面向对象和组件的C

27、编程科学版社如何理解引用类型如何理解引用类型“引用类型到底是什么东西啊?”我们用比喻法来回答您的问题。计算机的内存是用于存放数据的,所以内存好比是房屋。只有二种房屋:一种是“堆”,另一种是“栈”。但每种房屋会有许多房间,用“房间号”区分它们,“房间号”其实就是内存地址。doublex=12.3;/x是值类型变量,12.3直接存储在x中。doubley=x;/y是值类型变量,y=x导致12.3存储在y中。strings1=newstring(w,3);/s1是引用类型变量,s1存储的是地址0x01-对象的引用。strings2=Hello;/s2存储的是地址0x02对象Hello的引用。stri

28、ngs3;/s3是引用类型变量,s3什么也没有存储。strings4=s2;/s4=s2,导致地址0x02存储在s4中。叔莫附尸瘤鸟稳袍酋砰豢磨赁盂砧盒伞褪塞赐煤松叹事毅礼企懒柑试坤愤面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社内建系统类型和自定义类型内建系统类型和自定义类型(分类方法(分类方法2)如果按类型是系统定义好的还是用户自定义的来区分,C#类型可分为内建系统类型和自定义类型。有5种C#类型可由用户自定义:类类型、结构类型、接口类型、枚举类型和委托类型。其它的都是系统内建好的,用户可直接使用。内建系统类型=简单类型+两个引用类型(string和object类)散歌拴拜夕

29、弧扫浆籽味角砧桥腐徽菜尝香出书剃残瞧水涤岂机椒蔡都荫椒面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社C#内建系统类型铂匠堑盎莫妥琢毛屠匀惺讶含搞糠宁恩鲜酌雨贤裙干仔恭杠畸炮击瘴凹雍面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社CLS的类型注:符合CLS的类型可以被任何托管编程语言使用。如果你的程序中出现了不符合CLS的数据,那么其他语言可能就不能使用它们。上表中,有一列(系统类型)专门给出了每种类型的完整名称。C#的所有基本类型都有一个短名称和一个完整名称。完整名称对应于BCL中命名的类型。这个名称在所有语言中都是相同的。其实从编译器的角度看,两种名称是完全一样的,

30、最终都将生成同样的代码。擎困皮戳颅闪胸割催吕彬舜坎定缕挝锹侍傍执振栋急镶太玖姓瑰贝逝婴应面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社自定义的值类型(枚举和结构)自定义的值类型(枚举和结构)其它其它“自定义类型自定义类型” 见第见第3章之后的内容章之后的内容1) 枚举枚举枚举类型是一组命名常数的值类型。下面的Color枚举类型有三个命名常数:Red、Green和Blue;它们的值分别为0、1和2。enumColorRed,Green,Blue虽然数值0、1、2代表三种颜色,但用命名(Red、Green、Blue)显然要好些,名称更好记忆与理解。这正是我们用枚举的原因所在。胀关豌夕

31、巳膀溪舀喻捻泅古瞅蒜伴衫盒肉惺钨戍谈漂的腋称毛皮癸抿矮兵面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社下面的程序演示了枚举的用法classProgramenumColor/定义枚举Red,Green,BluestaticvoidMain(stringargs)Colormyc=Color.Green;/给枚举变量赋值switch(myc)/判断枚举变量是什么值caseColor.Red:Console.WriteLine(redvalue=0,(int)myc);break;caseColor.Green:Console.WriteLine(greenvalue=0,(int)m

32、yc);break;caseColor.Blue:Console.WriteLine(bluevalue=0,(int)myc);break;相然冒禾鄂盾俘养途谚识耶兆慢睁窃雨买篷逾踪鹤狰压子点患褐刑锦袒姆面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2)结构)结构像类一样,结构可以包含数据成员和函数成员;与类不同的是:结构是值类型(不用分配堆),结构类型的变量直接保存结构的数据,而不是对象的引用。结构的一般定义为:修饰符struct结构名/下面是结构体,用于定义结构的成员修饰符类型字段;/数据成员修饰符类型方法()/方法稼颓柠框拉危只罚统茁误嘿孽波宁走础豪飞停泛划姆怯壕缎划率江

33、于越饺面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社结构存在的原因一般情况下,用类即可满足要求;但如果要求程序的性能高(运行快,节省空间),对于小的数据结构,用结构可以节省存储空间。这正是结构存在的原因所在。下面定义了点结构:structPointpublicintx,y;publicPoint(intx,inty)this.x=x;this.y=y;掸喳膀丫满废乾郴佳写盐例蓬抓努大则兹杰钠灭绷拯业辟计卯沁树脸谊卫面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社使用结构的代码片段如下:Pointp1=newPoint(10,10);/给结构变量赋值Pointp2=p1

34、;/赋值使p2建立了一个p1的副本p1.x=100;/修改p1.x,但p2.x不会受影响如果用类定义Point,则p2=p1语句使p1和p2变量引用同一个对象,当修改p1的值(p1.x=100),p2.x也发生了变化。这正是值类型与引用类型的差别。芽卿递粥灼烃力闭珠谤袖筷焕锨缚赔蹭嫩慨城绍困镭冠域躬项默针岭以锣面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社可空类型和不可空类型可空类型和不可空类型(分类方法(分类方法3)如果按类型是否接受null值来区分,C#类型可分为可空类型(可空类型(Nullable)和不可空类型。)和不可空类型。引用类型是可空类型,而其它的是不可空类型。但C

35、#提供了一种“可空类型”语法,只要在任何不可空类型后加“?”,就构成了可空的类型,如“int?”、“bool?”,所以下面语句是正确的:int?i=null;/null不等价于0stringst=null;/null不等价于无字符的串纂攒慧报引恼绞冻栓扮状懂苏绍兔羽另蔫忙已奈谆灵榆键入沿归赎斟啄叫面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社泛型和非泛型(分类方法泛型和非泛型(分类方法4)泛型泛型 见第见第12章章如果按类型是否接受参数来区分,C#类型可分为泛型(generic)和非泛型。泛型引入了类型参数,由一个泛型可以派生出许多特定的类型。“可空类型”语法其实就是泛型Syst

36、em.Nullable的简写,其中T是参数。int?是System.Nullable的简写。下面的二条语句是等价的:int?i=null;System.Nullablej=null;赤匆耘誊感剐跪眺省奸潍梆歧炽喘默滴哥陕迢狐评炬烹玻昌舱忘驶直虎末面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.3.2 简单类型简单类型(系统定义的值类型)(系统定义的值类型)简单类型包括数值类型以及bool和char类型。内容见教材,请自学2.3.4 结构类型(自定义的值类型)结构类型(自定义的值类型)内容见教材,请自学撰炬墅痪记碾培妙附扫苍必头趁恳确峦径快氮午诉冰笼檄铸可笆查灼姻蚤面向对象和组件

37、的C编程科学版社面向对象和组件的C编程科学版社2.3.5 字符串字符串(系统定义的引用类型)(系统定义的引用类型)【例2-10】字符串操作:“加”法,取子字符串,替换,插入等。staticvoidMain()strings1=小鸟;/定义一个字符串变量s1,并赋值strings2=s1+飞翔;/字符串“加”法/结果:s2=小鸟飞翔strings3=s2.Substring(1,3);/从字符串的开始位置1,取得长度为3的子串/结果:s3=鸟飞翔s3=s2.Replace(飞翔,自由);/把s2中子串飞翔替换为自由/结果:s3=小鸟自由s3=s3.Insert(2,-);/从位置2,插入字符串-

38、/结果:s3=小鸟-自由boolisEqual=(s1=s2);/判断二个字符串是否相等/结果:isEqual=falseboolisContain=s2.Contains(鸟飞翔);/判断s2中是否包含某字符串/结果:isContain=true/静态方法Format,格式化一个字符串,它与控制台程序格式化是相同的。s1=string.Format(小鸟飞了0公里,9);/结果:s1=小鸟飞了9公里虾溅脊疗队娇遗澎溪枪栖遥瞒囤袖桂仰议扰室酥叙淬漆共汝睫腐澜绕愁撬面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社部分string方法和属性井翁甄喜坦坎擞拥刻纠鄙胜跌另褐荐肢斜览晰急烧顶

39、毙妓着手傍缅浸烬原面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.3.6 数组(自定义的引用类型)数组(自定义的引用类型)数组是一种具有相同类型和名称的变量的集合,如一组整数、一组字符等。1) 一维数组一维数组一维数组类型的语法是在“非数组类型”后放方括号,一般形式为:非数组类型inta;/声明了一个数组变量a,初值null,a还没有分配内存空间。a=newint2;/在堆上分配了有2个整数单元的内存,其地址赋给了变量aa0=6;a1=4;/对数组的元素进行赋值。嘉铭拈啡力讫校早轿扣此谋虽窘虾硫茁袍岗短撞胶扯侥狂糙聋今纸红眶砂面向对象和组件的C编程科学版社面向对象和组件的C编程

40、科学版社2) 多维数组(矩形数组)多维数组(矩形数组)一般形式为:非数组类型n个逗号n个逗号表示的是数组的维度,即n+1维的数组。例如,int,表示二维整数数组类型,而下面的语句声明了一个二维数组b:int,b=newint3,21,2,3,4,5,6;或:int,b=newint3,21,2,3,4,5,6;肉笆媒佩槛甚捶程君憎疙愧贬肾久搏撇势个莹娇家绞玩鸽燎帚朱积漓售均面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.3.7 object类型类型(系统定义的引用类型)(系统定义的引用类型)所有的结构类型隐式地继承object类型,这样任何类型的值都能够被处理成对象。值类型的值

41、可以通过执行装箱(boxing)的操作处理为对象,也可用取消装箱unboxing,把object对象还原成值类型的值。inti=123;objectobj=(object)i;/装箱intj=(int)obj;/取消装箱岩谨氢顾筹囚聂俗睁苏辙雕桂捶末零致隧搭兑泣辑揣慌碱溢枕俺课随恰帧面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.3.8 变量类型之间的转换变量类型之间的转换有四种转换方式:隐式转换、强制类型转换、ToString函数、Convert类。1)隐式转换)隐式转换若两种变量的类型是兼容的或者目标类型的取值范围大于源类型时就可以使用隐式转换。inti=12;double

42、f=i;/隐式转换成功i=f;/不成功,因为f取值范围大于i吏寨蛤芦伟胞舰桶棋锗灌袭疚淋登赵敖潭诞肥剧卒肖颐鸵佛郴襄措箱琉至面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2) 强制类型转换强制类型转换强制类型转换告诉编译器:将一种类型的变量转换为另外一种类型的变量。隐式转换不能满足所有的编程需要,很多时候还是需要强制类型转换的。但强制转换可能产生的结果不够精确。强制类型转换语法为:(target-type)变量或表达式;inti=2;doubled=3.4;intv1=(int)(i+d);/强制转换:double-int数值柑栅谎比葡嘉耍娇搔盂躬洛琵戳剿把屋爬稠捕描回旨报峦衬章

43、传状木苦勃面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社3) ToString函数函数ToString函数用于将变量转化为字符串,各种类型的变量都可以用ToString。下面的代码把int变量转为字符串:inti=250;/i是整型变量strings=i.ToString();/结果:变量s的值是字符串“250”渺苔摸诡总赐畜畏榨芋聚迫派襟艰秧顺嘲驱撬构炕馆猾凉玖铣舔辜纽事亩面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社4) Convert类类ToString无法把一个字符串转为double类型的值。但可使用Convert类进行显示转换。例如:doubler=Con

44、vert.ToDouble(“3.14”);/Convert是静态类,ToDouble是它的函数运行结果:r=3.14,其值是由字符串“3.14”显示转换来的。表2-9Convert类的常见函数(见教材)呀羡腺墅律色够肤刀隶肯毕路栈劣象桶馒亦金绕勇期甥摧帐胀牙换对誓啮面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.4 运算符运算符运算符是用来定义表达式操作符的。C#提供了大量的运算符,从功能上可分为:算术运算符(+,-,*,/,%)位运算符(,&,|,)逻辑运算符(&,|,!)条件(赋值)运算符(? : )赋值运算符(=,+=,-=,*=,/=,%=,位运算符=)关系运算符(=

45、,!=,=)从运算对象上可以分为:单目运算符、双目运算符和三目运算符。樱凿魄额素槐伎锯窗牧成愿纺速探农跺镀恃参唐啦爬匈伶蒜爆翘赤谋陶磁面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.4.1 算术运算符和自增自减运算符算术运算符和自增自减运算符算术运算符是指对数值(如整数、小数等)进行算术运算所用的运算符,包括:加(+)、减(-)、乘(*)、除(/)、取余(%)自增和自减运算符包括:+,-自增运算符其实是加1的简化表示法,自减运算符是减1的简化表示法。例如x=x+1,用自增表达式表示为:x+,或:+x社睛迅彼幼笼青振赛鹅嚷只将手年抖育添怪凋韧怕别唾炯浙搞换些豌撬摘面向对象和组件的

46、C编程科学版社面向对象和组件的C编程科学版社2.4.2 位运算符位运算符位运算符有六种:,&,|,5&y=5);/y=5为true,但x5为false,故a=false结果:a=false其它逻辑运算见教材。医樊覆醉忽楚沁深试请彭疮蒂炬遇熔憋眶冻姚楞钡睦怂睹指几桅筏佰迅至面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.4.4 关系运算符关系运算符关系运算符又称为比较运算符,包括:=,!=,=它们一般用于条件表达式中,用来判断表达式是否符合条件。以上运算符的含义见教材的表2-13。假设x和y是double变量,如x=-6.4,y=3,则下面都是合法的关系表达式:xyx+3=y(x

47、3)!=(y=5)三个关系表达式的结果分别为:false,false,true凰臻荤侍艘款昔呻增埔彰茧簿爽犯贡吴豫亏度绦脐御冀康跳噬励弹厅苍簧面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.4.5 条件运算符条件运算符条件运算符是C#中唯一的一个三元运算符。一般形式为:?:如果满足条件就执行表达式1,否则执行表达式2。条件运算符常常用于条件赋值,一般形式为:变量=?:intb,x=6,y=4;b=(y一元算术移位关系按位逻辑赋值表示优先级高于。运算符中的一元运算符(!等)是例外,其他都遵循这个规律。醉磋宇凌谩恩碰哑臆辙仅魏惫麓畜熬艰柜斜兼斜纸八旧挝衔毅台仇誊径仲面向对象和组件的

48、C编程科学版社面向对象和组件的C编程科学版社2.5.2 运算符的结合性运算符的结合性结合性表示:当优先级相同的时候,按照运算符的结合方向确定运算的次序。运算符的结合性分为两种方式:左结合(从左到右)右结合(从右向左)左结合-从左到右,是一般方式。例如算术运算符:+,-,*,/嘴呻它青疾寻仗嘿樱辆秤临碑晰箩矩嘎及凶碗荧多以弟谦屠陷乃溃陀杠杠面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社结合性结合性只有三个运算符是从右至左结合的,它们是:一元运算符、条件运算符、赋值运算符。其它的都是从左至右结合。从左至右结合:x=10/2*5;/等价于x=(10/2)*5;赋值运算符从右至左结合:x

49、=y=3;/等价于y=3;x=y;点运算是自左向右结合的,因此a.b.c的含义是(a.b).c而不是a.(b.c)。System.Console.Write(OK);/等价于:(System.Console).Write(OK);蟹肇订辖晦例鹃拖艾玖眨兄疡坞汛聘右臆窃孟剿箔赣耻挤莫候屉聊图烬篓面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社2.6 编程练习编程练习1 编程要求编程要求编写一个控制台程序,程序可以从键盘读一组正整数,读到-1结束;程序对输入的一组正整数进行计数,并记录最大和最小数,最后输出它们。2 编程要点编程要点编程要用循环语句(while)等待用户从键盘输入,用条件语句(if)判断不同情况,做不同的处理,然后用控制台的WriteLine函数输出结果。嘲仇元酝审拔总浇犀觅颂祝效返喜读作宝露痛渐缕业虚笔拇民扣乏梆葬怂面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社感谢!茨讹瓶溜浙牛伟诺茸伶右盯氏鸦旱持爱置虑驼疾饿栅果豢磋毫亲府阀冒沏面向对象和组件的C编程科学版社面向对象和组件的C编程科学版社

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号