




已阅读5页,还剩82页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章数据类型与流程控制,2.1数据类型2.2不同数据类型之间的转换2.3常量与变量2.4运算符与表达式2.5控制台应用程序与格式化输出2.6C#流程控制语句,2.1数据类型,C#数据类型分为两类:值类型和引用类型。P17值类型:包括简单类型、枚举类型、结构类型、可空类型。引用类型:包括类、接口、数组、委托。一般把引用类型的变量称为对象。,值类型与引用类型,栈和堆,内存基本上被划分为栈和堆栈是用来存储值类型变量的数据结构,如创建int变量时,该变量的值存储在栈上,此外对函数(方法)的任何调用都添加到栈的顶端,在函数返回时删除该调用。堆用于存储引用类型的变量,在创建类的实例时在堆上分配对象,返回该对象的地址,并且将该地址存储在位于栈上的变量中。,值类型:C#的所有值类型均隐式派生自SYSTEM.VALUETYPE:1、结构体:Struct(直接派生于SYSTEM.VALUETYPE);2、数值类型:整型:SBYTE,SHORT,INT,LONG,BYTE,USHORT,UINT,ULONG,CHAR;浮点型:FLOAT,DOUBLE;用于财务计算的高精度DECIMAL型;3、BOOL型:BOOL(SYSTEM.BOOLEAN的别名);4、用户定义的结构体(派生于SYSTEM.VALUETYPE)。5、枚举:ENUM(派生于SYSTEM.ENUM);6、可空类型(派生于SYSTEM.NULLABLE泛型结构体,T?实际上是SYSTEM.NULLABLE的别名)。,值类型与引用类型区别,值类型:C#中的所有值类型变量在声明时都有初始值,然而没有明确地初始化变量,C#就禁止使用该变量。如:boolmarried;Console.WriteLine(married);则提示错误信息“使未赋值的变量married”C#中可以将值类型声明为可空(nullable),意味着它可以暂时没有值。如:bool?married=null;或者Nullablemarried=null;,值类型与引用类型区别,引用类型:1、数组(派生于System.Array)2、用户用定义的以下类型:类:class(派生于System.Object);接口:interface(接口不存在派生于何处的问题。3、委托:delegate(派生于System.Delegate)。4、Object(System.Object的别名);5、字符串:string(System.String的别名)。,值类型与引用类型区别,值类型与引用类型区别,堆栈,堆,5,6,i,j,实际数据,12345H,obj,图中i和j为值类型变量,obj为引用类型变量,值类型的变量保存的是变量的值;引用类型的变量保存的是数据的引用地址。,引用类型分两步创建:首先在堆栈上创建一个引用变量,然后在堆上创建对象本身,再把这个内存的句柄(也是内存的首地址)赋给引用变量例如:strings1,s2;s1=ABCD;s2=s1;其中,s1,s2是指向字符串的引用变量,s1的值是字符串“ABCD”存放在内存的地址,这就是对字符串的引用,两个引用型变量之间的赋值,使得s2、s1都是对“ABCD”的引用。如下图所示。,值类型与引用类型区别,(1)考虑如下代码:inti=5;intj=6;intk=i;i=7;问k的值是多少?(2)假设类A有实例Obj,Obj1,执行如下代码Obj.age=10;Obj1=Obj;Obj1.age=12;问此时Obj.age的值是多少?,值类型与引用类型区别,值类型和引用类型的区别,为什么要托管堆(受管制的堆)?,.NET框架包含一个托管堆,所有的.NET语言在分配引用类型对象时都要使用它。像值类型这样的轻量级对象始终分配在栈中,但是所有的类实例和数组都被生成在一个内存池中,这个内存池就是托管堆。垃圾收集器的基本算法很简单:将所有的托管内存标记为垃圾寻找正被使用的内存块,并将他们标记为有效释放所有没有被使用的内存块整理堆以减少碎片,相关面试题目,intk=5;intj=5;if(Object.ReferenceEquals(k,j)/判定k和j是否为同一个实例Console.WriteLine(Equal);elseConsole.WriteLine(NotEqual);Objecto=newobject();Objectobj=o;if(Object.ReferenceEquals(o,obj)Console.WriteLine(Equal);elseConsole.WriteLine(“NotEqual”);,运行结果:NotEqualEqual,2.1.2整型,C#提供了八种整型(即计算机组成原理中的“定点数”):sbyte:1字节有符号byte:1字节无符号short:2字节有符号ushort:2字节无符号int:4字节有符号,最常用uint:4字节无符号long:8字节有符号ulong:8字节无符号,2.1.3浮点类型,float:4字节浮点数,常用。例如:35.0fdouble:8字节浮点数,常用。例如:2.7E+23decimal:16字节浮点数,特殊的浮点数,精度高,适用于金融、货币等需要高精度数值的领域。其类型指定符为M(或m)。例如:decimaly=9999999999999999999999999m;float和double的浮点数格式与计算机组成原理介绍的IEEE754规定的格式相同,C#中所有非整数的数值始终被视为双精度,如果将非整数的数值赋给float类型的变量,需要在该数之后附加F或者f后缀,否则会出现错误“不能隐式地将Double类型转换为“float”类型;请使用“F”后缀创建此类型”。如floati=3.99f;同样需要使用M后缀将非整数值赋给decimal变量如decimald=4.56M;,2.1.3浮点类型,2.1.4布尔型,用bool表示,bool类型只有两个值true和false。例如:boolisExist=false;boolb=(i0/错误,2.1.5字符型与字符串类型,char型,为单个Unicode字符,字符型常量必须用单引号引起来。例如:charch=a;如果是字符串(单个字符的组合),对应的类型为string。string类型的常量用双引号将字符串引起来。例如:stringstr=hello;char和string类型的常量均可以使用转义符。C#中加在字符串前面,字符串中的失去转义符的作用,直接写字符串而不需要考虑转义字符,如果在字符串中需用到双引号,则可连写两个双引号来表示一个双引号。C:windowsMicrosoft/与C:windowsMicrosoft含义相同HesaidHellotome/与HesaidHellotome含义相同,2.1.5字符型与字符串类型,2.2不同数据类型之间的转换,有两种转换方式:隐式转换与显式转换;如果是不同值类型之间的转换,可以使用Convert类提供的静态方法。,2.2.1隐式转换和显式转换,隐式转换:系统默认的,不需要加以声明就可以进行的转换。从低精度、小范围的数据类型转换为高精度、大范围的数据类型,可以用隐式转换。例如:intk=1;longi=2;i=k;/隐式转换,2.2.1隐式转换和显式转换,显式转换:也称为强制转换。用户必须明确地指定转换的类型。例如:longk=2147483649;inti=(int)k;所有的隐式转换也都可以采用显式转换的形式来表示。如:inti=10;longj=(long)i;将大范围类型的数据转换为小范围类型的数据的时候,属于显式转换,另外还必须特别谨慎,因为此时有丢失数据的危险。,例题,下面声明了一些数值类型的变量:shortsvalue;intivalue;uintuvalue;longlvalue;doubledvalue;floatfvalue;在对各个变量赋过初值之后,试分析下面哪些转换是正确的,哪些是错误的,并写出解决办法。1)svalue=uvalue;/无法将类型“uint”隐式转换为“short”。存在一个显式转换(是否缺少强制转换?)错误;svalue=(short)uvalue;2)lvalue=svalue;正确3)fvalue=dvalue;错误;fvalue=(float)dvalue;4)lvalue=dvalue;错误;lvalue=(long)dvalue;,2.2.2装箱与拆箱P22,Object类型:所有其他引用类型的基类。装箱:将值类型转换为object类型inti=123;objecto=i;拆箱:显式地将object类型转换为值类型inti=123;Objectbox=i;/装箱操作intk=(int)box;/拆箱操作装箱和拆箱是互逆的过程,但是必须要注意,装箱和拆箱必须满足类型兼容的原则。,装箱时它首先创建一个对象实例,然后把值类型的值复制到这个对象实例,最后由object对象引用这个对象实例。,例如:usingSystem;classDemopublicstaticvoidMain()intx=123;objectobj1=x;/装箱操作x=x+100;/改变x的值,此时obj1的值并不会随之改变Console.WriteLine(x=0,x);/x=223Console.WriteLine(obj1=0,obj1);/obj1=123,2.2.2装箱与拆箱,拆箱操作与装箱相反,它是将一个object类型转换成值类型。首先检查由object引用的对象实例值类型的包装值,然后把实例中的值拷贝到值类型的变量中。classDemopublicstaticvoidMain()intx=123,y;objectobj1=x;/装箱操作x=x+100;/改变x的值,此时obj1的值并不会随之改变y=(int)obj1;/拆箱操作,必须进行强制类型转换Console.WriteLine(x=0,x);/x=223Console.WriteLine(obj1=0,obj1);/obj1=123Console.WriteLine(y=0,y);,2.2.2装箱与拆箱,2.3常量和变量,C#中提供2种类型的常量:使用const关键字声明(const字段只能在该字段的声明中初始化。)const常量是在编译时设置其值并且永远不能更改其值的字段,在对程序进行编译的时候,编译器会把所有const常量全部替换为常数。constdoublePI=3.14;使用readonly关键字声明readonly关键字在程序运行期间只能初始化“一次”的字段,可以在声明语句中初始化该字段,也可以在构造函数中初始化该字段。初始化以后,用readonly声明的字段的值就不能再更改。publicreadonlystringb;publicForm1()b=“bbb”;,2.3.1常量,二者区别:readonly常量运行时初始化,const常量编译时初始化。const常量只能在声明中赋值,readonly常量既可以在声明中赋值,也可以在构造函数中赋值。,2.3.2变量,变量用来表示一个数值、一个字符串值或者一个类的对象。变量存储的值可能会发生更改,但变量名称保持不变。C#定义了7类变量,分别是:静态变量、实例变量、数组元素、值参数、引用参数、输出参数和局部变量。classApublicstaticintx;/静态变量inty;/局部变量voidF(intv,inta,refintb,outintc)inti=1;c=a+b+;,2.3.2变量,声明变量举例:inta=100;/声明一个整型变量a,并赋初值为100也可以采用先定义、后赋值的方式,例如:inta;/声明一个整型变量aa=100;/为整型变量a赋值为100另外,也可以把几个变量声明和初始化用一条语句完成,各个变量之间用逗号分隔,例如:inta=100,b,c=200,d;/声明整型变量a、b、c、d,并将a赋值100,c赋值200,2.3.3匿名类型的变量,匿名类型的变量就是程序员不必指定“局部”变量的类型,统统用var来表示类型即可。在LINQ表达式或者foreach语句中,使用匿名类型的变量比较方便。匿名类型仍然属于强类型,只不过判断具体类型的工作由编译器完成。具体内容到LINQ一节再仔细讲解。【例】vari=5;System.Console.WriteLine(i.GetType();,2.4运算符和表达式,1.运算符C#提供了3大类运算符:一元运算符:带有一个操作数的运算符称为“一元”运算符,例如,i+。二元运算符:带有两个操作数的运算符称为“二元”运算符,例如,x+y。三元运算符:带有三个操作数的运算符称为“三元”运算符,在C#中,只存在1个三元运算符,即条件运算符“?:”。例如:intz=3;intx=(z=3)?2:3;常用运算符typeof:获取类型的System.Type例如:System.Typetype=typeof(int);,2.4运算符和表达式,is:检查对象是否与给定的类型兼容例如:if(oisClass1)a=(Class1)o;as:xasT含义为返回类型为T的x。例如:Class1c=basClass12.表达式C#的表达式与C+和Java类似。,2.5控制台应用程序与格式化输出,控制台(Console类)1.控制台输出Console.Write();把各种类型的数据或对象转换成字符串写入标准输出流。Console.WriteLine();把各种类型的数据或对象转换成字符串写入标准输出流,与Write的区别在于,它还输出回车符和换行符(“rn”);,2.5控制台应用程序与格式化输出,2.控制台输入Console.ReadKey();P27标准输入流读取用户按下的字符或功能键。例如:ConsoleKeyInfoc=Console.ReadKey();Console.ReadLine();从标准输入流读取一行字符。例如:strings=Console.ReadLine();,3.字符串的格式化输出,字符串格式化:Console类的Write或WriteLine方法;String.Format方法中均可以规定输出字符串的格式。格式输出的一般形式为N,M:格式码其中,:表示其中的内容为可选项。N:从零开始的整数,表示第几个参数。M:可选整数,表示最小长度。若参数N的长度小于M,就用空格填充。如果M为负,则左对齐;如果M为正,则右对齐;如果未指定M,则默认为零。格式码:可选的格式化代码字符串。,字符串的格式化输出,对于字符串来说,可以直接利用格式化输出得到希望的格式,例如:strings=string.Format(0,30,);/s得到的结果为30个空格的字符串strings1=string.Format(0,-20,15);/s1得到的结果为左对齐长度为20的字符串,常用格式码及举例,4.数字的格式化输出,常用格式举例:strings=string.Format(0:d6,123);/s得到的结果为000123inti=123;doublej=123.45;strings1=string.Format(格式:d6,数0,输出结果:0:d6,i);Console.WriteLine(s1);/结果为:格式d6,数123,输出结果:000123strings2=string.Format(i:0,-7,j:1,7,i,j);Console.WriteLine(s2);/结果为:i:123,j:123.45,4.数字的格式化输出,strings3=string.Format(0:#,#.00,i);Console.WriteLine(s3);/结果12.00intnum=0;strings4=string.Format(0:#,num);Console.WriteLine(s4);/结果输出长度为0的空字符串其他格式化符使用举例格式:n4数12345.6789输出结果:12,345.6789格式:p数0.126输出结果:12.60%格式:p2数12.34输出结果:1,234.00%格式:5:d数123输出结果:123格式:7:f3数123.45输出结果:123.450,5.日期和时间的格式化输出,DateTimedt=newDateTime(2006,5,25);/yy表示年占两位,M表示月占1位,超出1位按实际位数/d表示日占1位,超出1位按实际位数stringstr=dt.ToString(yy.M.d);Console.WriteLine(str);/结果06.5.25/yyyy表示年占4位,M表示月占1位,超出1位按实际位数,其他按原字符输出stringstr1=dt.ToString(yyyy年M月);Console.WriteLine(str1);/结果2006年5月中文操作系统下使用英文日期见课本P30,2.6C#流程控制语句,流程控制的形式:顺序分支循环异常捕获如果一个逻辑块包含两条或两条以上的语句序列,必须使用大括号将语句括起来。,2.6.1条件分支语句,if语句:根据布尔表达式的值(true或者false)选择要执行的语句序列,使用时要注意else应和最近的if语句匹配。三种形式:ififelseifelseifelse,2.6.1条件分支语句,【例题2-2】的关键点:从键盘读取一个字符串方法stringstr=Console.ReadLine();将字符串转换成整型数据intx=Convert.ToInt32(str);/适合于任何类型转换成整型数据intx=int.Parse(str);boolb=int.TryParse(str,outx);针对字符串类型intx=Int32.Parse(str);,雅虎面试题:,一列数的规则如下:1、1、2、3、5、8、13、21、34.求第30位数是多少,用递归算法实现。实现关键代码:publicstaticintFoo(inti)if(i0,2.6.1条件分支语句(续),switch语句也叫case语句(开关语句)switch语句与C+和Java均不完全相同。switch语句常用形式为:switch(表达式)case常量表达式1:语句序列1case常量表达式2:语句序列2default:语句序列,2.6.1条件分支语句(续),常量表达式switch条件表达式的值和每个case后的常量表达式可以是string、int、char、enum或其它值类型。语句序列每个case后的语句序列可以用大括号括起来,也可以不用,但是每个case块的最后一句一定要是break语句,或者是goto语句。switch语句的执行顺序a)如果switch语句的条件表达式的值和某一个case标记后指定的值相等,则转到该case标记后的语句序列执行;b)若switch语句的条件表达式的值和任何一个case标记后指定的值都不相等,则跳到default标记后的语句序列执行;,2.6.1条件分支语句(续),c)若switch语句下面没有default标记,则跳到switch语句的结尾。注意:a)要求每个语句序列的最后一条语句必须是break语句,但是有一个情况例外:如果某个case块为空,则会从这个case块直接跳到下一个case块上。“不穿透原则”b)如果case后有语句,则此case的顺序怎么放都无所谓,甚至可以将default子句放到最上面。因此,在一个switch中,不能有相同的两个case标记。,例.使用switch语句,完成对成绩等级的评定,usingSystem;namespaceSwitchExamplepublicclassProgrampublicstaticvoidMain()Console.Write(请输入成绩:);/从键盘接收一行字符stringstr=Console.ReadLine();/转换为整型,注意此语句可能会产生异常,一般需要异常处理inti=Int32.Parse(str.Trim();/或者int.Parse()或者Convert.ToInt32()if(i100|i0)Console.WriteLine(成绩不在0-100范围内);,elseswitch(i/10)/整除case10:Console.Write(满分,);gotocase9;case9:Console.WriteLine(优秀);break;case8:case7:Console.WriteLine(良好);break;case6:Console.WriteLine(及格);break;default:Console.WriteLine(不及格);break;Console.ReadLine();,2.6.2循环语句,循环包括:for语句while语句do-while语句foreach语句,用于对集合、数组进行操作。,2.6.2循环语句(续),1.for语句一般形式:for(初始值;循环条件;循环控制)语句序列注意:for(;)为无穷循环,例.使用for语句控制循环体,publicstaticvoidMain()Console.Clear();Console.BackgroundColor=ConsoleColor.Blue;Console.ForegroundColor=ConsoleColor.Red;Console.Beep();for(inti=1;i10;i+=2)Console.SetCursorPosition(40-i/2,i);for(intj=0;j20|age10)stringmessage=“你输入的龄不符合要求!;ageexceptiona=newageexception(message);throwa;catch(Exceptionerr)Console.WriteLine(err.Message);Console.ReadLine();,例.异常处理,usingSystem;namespaceTryCatchExampleclassProgramstaticvoidF()tryG();catch(Exceptionerr)Console.WriteLine(方法F中捕获到:+err.Message);,/重新抛出当前正在由catch块处理的异常errthrow;staticvoidG()thrownewException(方法G中抛出的异常。);staticvoidMain()tryF();catch(Exceptionerr)Console.WriteLine(方法Main中捕获到:+err.Message);Console.ReadLine();,本章涉及的面试题目,C#的数据类型有()(某IT公司)a)值类型和调用类型;b)值类型和引用类型;c)引用类型和关系类型;d)关系类型和调用类型;下列选项中,()是引用类型。(某IT公司)a)enum类型b)struct类型c)string类型d)int类型,本章涉及的面试题目(续),Question42.(单选)(雅虎公司)publicstaticvoidMain(stringargs)inti=2000;objecto=i;i=2001;intj=(int)o;Console.WriteLine(i=0,o=1,j=2,i,o,j);1.i=2001,o=2000,j=20002.i=2001,o=2001,j=20013.i=2000,o=2001,j=20004.i=2001,o=2000,j=2001,做能自动生成试卷的考试系统时,常常需要随机生成一组不重复的题目,在.netFrame
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025陕西建工新能源有限公司校园招聘(27人)笔试参考题库附带答案详解
- 2025辽宁沈阳地铁集团有限公司所属公司招聘11人笔试参考题库附带答案详解
- 2025福建省船舶工业集团有限公司招聘5人笔试参考题库附带答案详解
- 2025年芜湖城市园林集团股份有限公司招聘30人笔试参考题库附带答案详解
- 2025年湖南长沙振望投资发展有限公司招聘8人笔试参考题库附带答案详解
- 2025年榆林市公共交通总公司招聘(57人)笔试参考题库附带答案详解
- 2025年山东电工电气集团有限公司社会招聘(44人)笔试参考题库附带答案详解
- 2025年国网河南省电力公司招聘高校毕业生约350人(第二批)笔试参考题库附带答案详解
- 2025年合肥市建投集团春季招聘89人笔试参考题库附带答案详解
- 2025四川九州电子科技股份有限公司招聘生产装配等岗位72人笔试参考题库附带答案详解
- 世界避孕日培训
- 政务摄影培训课件模板
- 职业健康卫生培训课件
- 快递行业包裹分拣操作流程模拟题
- 辅助生殖妊娠营养干预
- 模块六 点的投影(课件)-中职高考《机械制图》一轮复习(高教版第5版)
- 健康素养促进项目课件
- 2024湘美版小学书法三年级上册教学设计(附目录)
- 固定摊位合租协议书
- 2025年国企人力资源管理岗招聘考试真题卷(含岗位说明书)
- 中国药典2025年版1~4部目录
评论
0/150
提交评论