C#第2章数据类型与流程控制.ppt_第1页
C#第2章数据类型与流程控制.ppt_第2页
C#第2章数据类型与流程控制.ppt_第3页
C#第2章数据类型与流程控制.ppt_第4页
C#第2章数据类型与流程控制.ppt_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 第2章 数据类型与流程控制 2.1 数据类型 2.2 不同数据类型之间的转换 2.3 常量与变量 2.4 运算符与表达式 2.5 控制台应用程序与格式化输出 2.6 C#流程控制语句 2 2.1 数据类型 uC#数据类型分为两类:值类型和引用类型。P17 m值类型: 包括简单类型、枚举类型、结构类型、可空类型。 u引用类型: m 包括类、接口、数组、委托。 一般把引用类型的变量称为对象。 3 值类型与引用类型 4 栈和堆 内存基本上被划分为栈和堆 l 栈是用来存储值类型变量的数据结构,如创建int变量时, 该变量的值存储在栈上,此外对函数(方法)的任何调用都 添加到栈的顶端,在函数返回时删除该调用。 l 堆用于存储引用类型的变量,在创建类的实例时在堆上分配 对象,返回该对象的地址,并且将该地址存储在位于栈上的 变量中。 5 值类型: 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的别名)。 值类型与引用类型区别 6 值类型: C#中的所有值类型变量在声明时都有初始值,然而没有明确 地初始化变量,C#就禁止使用该变量。 如: bool married; Console.WriteLine(married); 则提示错误信息“使未赋值的变量married” C#中可以将值类型声明为可空(nullable),意味着它可以暂 时没有值。 如:bool?married=null; 或者Nullable married = null; 值类型与引用类型区别 7 引用类型: 1、数组(派生于SYSTEM.ARRAY) 2、用户用定义的以下类型: 类:class(派生于SYSTEM.OBJECT); 接口:interface(接口不存在派生于何处的问题。 3、委托:delegate(派生于SYSTEM.DELEGATE)。 4、Object(System.OBJECT的别名); 5、字符串:string(System.String的别名)。 值类型与引用类型区别 8 值类型与引用类型区别 堆栈堆 5 6 i j 实际数据 12345H obj 图中i和j为值类型变量,obj为引用类型变量 值类型的变量保存的是变量的值; 引用类型的变量保存的是数据的引用地址。 9 引用类型分两步创建:首先在堆栈上创建一个引用变量, 然后在堆上创建对象本身,再把这个内存的句柄(也是内 存的首地址)赋给引用变量 例如: string s1, s2; s1=“ABCD“; s2 = s1; 其中,s1,s2是指向字符串的引用变量,s1的值是字符串 “ABCD”存放在内存的地址,这就是对字符串的引用,两个 引用型变量之间的赋值,使得s2、s1都是对“ABCD”的引用 。如下图所示。 值类型与引用类型区别 10 (1)考虑如下代码: int i=5; int j=6; int k = i; i=7; 问k的值是多少? (2) 假设类A有实例Obj,Obj1,执行如下代码 Obj.age = 10; Obj1 = Obj; Obj1.age = 12; 问此时Obj.age的值是多少? 值类型与引用类型区别 11 值类型和引用类型的区别 特性值类型引用类型 变量中保存的内容实际数据指向实际数据的引用指针 内存空间配置堆栈(Stack)受管制的堆(Managed Heap ) 内存需求较少较多 执行效率较快较慢 内存释放时间点执行超过定义变量的 作用域时 由垃圾回收机制负责回收 12 为什么要托管堆(受管制的堆)? .NET框架包含一个托管堆,所有的.NET语言在分配引用 类型对象时都要使用它。像值类型这样的轻量级对象始终分 配在栈中,但是所有的类实例和数组都被生成在一个内存池 中,这个内存池就是托管堆。 垃圾收集器的基本算法很简单: 将所有的托管内存标记为垃圾 寻找正被使用的内存块,并将他们标记为有效 释放所有没有被使用的内存块 整理堆以减少碎片 13 相关面试题目 int k=5; int j=5; if (Object.ReferenceEquals(k, j) /判定k和j是否为为同一个实实例 Console.WriteLine(“Equal“); else Console.WriteLine(“Not Equal“); Object o = new object(); Object obj = o; if (Object.ReferenceEquals(o, obj) Console.WriteLine(“Equal“); else Console.WriteLine(“Not Equal”); 运行结果: Not Equal Equal 14 2.1.2 整型 uC#提供了八种整型(即计算机组成原理中的“定点数”): sbyte:1字节有符号 byte: 1字节无符号 short: 2字节有符号 ushort:2字节无符号 int: 4字节有符号,最常用 uint: 4字节无符号 long: 8字节有符号 ulong:8 字节无符号 15 2.1.3 浮点类型 float:4字节浮点数,常用。例如:35.0f double:8字节浮点数,常用。例如:2.7E+23 decimal:16字节浮点数,特殊的浮点数,精度高,适用于 金融、货币等需要高精度数值的领域。其类型指定符为M( 或m)。 例如: decimal y = 9999999999999999999999999m; float和double的浮点数格式与计算机组成原理介绍的 IEEE754规定的格式相同 16 C#中所有非整数的数值始终被视为双精度,如果将非整数 的数值赋给float类型的变量,需要在该数之后附加F或者f后 缀,否则会出现错误“不能隐式地将 Double 类型转换 为“float”类型;请使用“F”后缀创建此类型”。 如 float i=3.99f; 同样需要使用M后缀将非整数值赋给decimal变量 如 decimal d=4.56M; 2.1.3 浮点类型 17 2.1.4 布尔型 u 用bool表示,bool类型只有两个值true和false。 例如: bool isExist = false; bool b = (i0 循环体内的程序至少会执行一次,然后再判断条 件是否为true,如果条件为true,则继续循环。 59 2.6.3 跳转语句 u 1.break语句 功能:退出最近的封闭switch、while、do- while、for或foreach语句。 格式: break; 60 【例】循环接收和输出键盘输入的每一行的值,当接收的 内容为空字符串时退出。 using System; namespace BreakExample public class Program public static void Main() for (; ; ) Console.Write(“请输入一个字符串(直接回车退出) :“); string s = Console.ReadLine(); if (s = “) break; Console.WriteLine(“你输入的是: 0.“, s); Console.ReadLine(); 61 2.6.3 跳转语句 (续) u 2.continue语句 功能:将控制传递给下一个while、do-while 、 for或foreach,继续执行下一次循环。 格式: continue ; 62 2.6.3 跳转语句 (续) u 3.goto语句 仅在下面两种情况下才可能会使用goto语句: (1)用于switch语句中从一个case标签转到另一个 case标签处。 (2)用于直接退出到多重嵌套循环的外部。 63 2.6.3 跳转语句 (续) u4.return语句 功能:将控制返回到出现return语句的函数成员的调用 方。 格式:return 表达式; 其中表达式为可选项,如果该函数成员的返回类型不为 null,则return语句必须使用表达式返回这个类型的值, 否则return语句不能使用表达式。 64 看例子,思考如下问题: (1)如何求字符串长度 (2)如何求字符串中某个序号对应的字符 (3)如何判断字符串中的某个字符是数字还是字母 (4)如何截取字符串 解答:假设str为字符串类型的变量 (1)str.Length即得字符串的长度 (2)strindex /index为下标,取值为0-str.Length-1; (3)Char.IsDigit(ch) /判断是否为数字 Char.IsLetter(ch)/判断是否为字母 (4)str.SubString(startIndex,length)/从下标为 startIndex开始截取长度为length的字符串 【例2-9】循环与跳转综合举例 65 2.6.4 异常处理 异常是程序执行时遇到的任何错误情况或意外行为。 在C#里,异常处理就是C#为处理错误情况提供的一种机制 。它为每种错误情况提它为每种错误情况提供了定制的处 理方式,并且把标识错误的代码与处理错误的代码分离开 来 在.Net Fraework中,异常是从Exception类继承的对象。 异常从发生问题的代码区域引发,然后沿堆栈向上传递, 直到应用程序处理它或程序终止。 66 系统定义的经常用到的异常系统定义的经常用到的异常 System.OutOfMemoryExceptionSystem.OutOfMemoryException用用newnew分配内存失败分配内存失败 System.NullReferenceExceptionSystem.NullReferenceException对象为空对象为空 Syetem.IndexOutOfRangeExceptionSyetem.IndexOutOfRangeException数组边界超出数组边界超出 System.ArithmaticExceptionSystem.ArithmaticException算术操作异常的基类算术操作异常的基类 System.DivideByZeroExceptionSystem.DivideByZeroException除零错除零错 System.OverflowExceptionSystem.OverflowException溢出错误溢出错误 System.ArrayTypeMismatchExceptionSystem.ArrayTypeMismatchException数组类型不匹配数组类型不匹配 67 2.6.4 异常处理 1.try-catch语句 try 语句序列 catch(异常类型 标识符) 异常处理 在程序运行正常的时候,执行try块内的程序。如果try块中代 码出现了异常,程序就转移到catch块中指定的异常进行处理。 68 1.try-catch语句 public void test() try int b = int.Parse(“abc“); catch (FormatException ex) Console.WriteLine(ex.Message); 2.6.4 异常处理 69 2:try-finally语语句 l try语句块包含可能产生异常的代码 finally中指定最终都 要执行的子语句 l 与格式1比较,程序不提供对异常的处理,只保证finally语 句块中的代码一定被执行 public void test() try int b = int.Parse(“abc“); finally Console.WriteLine(“执行结束“); 2.6.4 异常处理 70 2.6.4 异常处理 3.try-catch-finally语句 try语句块中包含可能产生异常的代码,catch中指定对 异常的处理,finally中指定最终都要执行的子语句, 放在所有catch后,只能出现一次。 71 public void test() try int b = int.Parse(“abc“); catch (FormatException ex) Console.WriteLine(ex.Message); finally Console.WriteLine(“执行结束“); 2.6.4 异常处理 72 3.throw语句 格式:throw 表达式; 抛出表达式的值。 注意表达式类型必须是System.Exception或从System.Exception 派生的类的类型。 throw也可以不带表达式,不带表达式的throw语句只能用在 catch块中,在这种情况下,它重新抛出当前正在由catch块处 理的异常。 throw语句可以重新引发一个已捕获的异常,还可以引发一个 预定义的或自定义的异常,可被外围的try语句接收,throw引发 的异常称为显式引发异常。 2.6.4 异常处理 (续) 73 自定义异常 除了可以使用系统预定义的异常以为,还可以根据需要自 己定义异常。由Exception或者Exception类的子类派生。 步骤: 1.自定义异常类,继承自某个异常 2.重写构造函数和属性(Message属性),或者声明方法 3.在可能出现问题的地方调用 74 class ageexception : Exception string _message; /获得父类的错误信息内容 public ageexception() _message = base.Message; public ageexception(string strmessage) _message = strmessage; /重写message属性 public override string Message get return _message ;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论