C#第2章数据类型与流程控制.ppt
《C#第2章数据类型与流程控制.ppt》由会员分享,可在线阅读,更多相关《C#第2章数据类型与流程控制.ppt(87页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 1第第2 2章章 数据类型与流程控制数据类型与流程控制2.1 2.1 数据类型数据类型2.2 2.2 不同数据类型之间的转换不同数据类型之间的转换2.3 2.3 常量与变量常量与变量2.4 2.4 运算符与表达式运算符与表达式2.5 2.5 控制台应用程序与格式化输出控制台应用程序与格式化输出2.6 2.6 C#C#流程控制语句流程控制语句2 22.1 2.1 数据类型数据类型uC#C#数据类型分为两类:值类型和引用类型。数据类型分为两类:值类型和引用类型。P17P17m值类型值类型:包括简单类型、枚举类型、结构类型、可空类型。包括简单类型、枚举类型、结构类型、可空类型。u引用类型引用类型
2、:m 包括类、接口、数组、委托。包括类、接口、数组、委托。一般把引用类型的变量称为对象一般把引用类型的变量称为对象。3 3值类型与引用类型值类型与引用类型4 4栈和堆栈和堆内存基本上被划分为栈和堆内存基本上被划分为栈和堆l栈是用来存储值类型变量的数据结构,如创建栈是用来存储值类型变量的数据结构,如创建intint变量时,变量时,该变量的值存储在栈上,此外对函数(方法)的任何调用都该变量的值存储在栈上,此外对函数(方法)的任何调用都添加到栈的顶端,在函数返回时删除该调用。添加到栈的顶端,在函数返回时删除该调用。l堆用于存储引用类型的变量,在创建类的实例时在堆上分配堆用于存储引用类型的变量,在创建
3、类的实例时在堆上分配对象,返回该对象的地址,并且将该地址存储在位于栈上的对象,返回该对象的地址,并且将该地址存储在位于栈上的变量中。变量中。5 5值类型:值类型:C#的所有值类型均隐式派生自的所有值类型均隐式派生自SYSTEM.VALUETYPE:1、结构体:结构体:Struct(直接派生于(直接派生于SYSTEM.VALUETYPE););2、数值类型:数值类型:整型:整型:SBYTE,SHORT,INT,LONG,BYTE,USHORT,UINT,ULONG,CHAR;浮点型:浮点型:FLOAT,DOUBLE;用于财务计算的高精度用于财务计算的高精度DECIMAL型型;3、BOOL型:型:
4、BOOL(SYSTEM.BOOLEAN的别名);的别名);4、用户定义的结构体(派生于用户定义的结构体(派生于SYSTEM.VALUETYPE)。)。5、枚举:枚举:ENUM(派生于(派生于SYSTEM.ENUM););6、可空类型(派生于可空类型(派生于SYSTEM.NULLABLE泛型结构体,泛型结构体,T?实际上是实际上是SYSTEM.NULLABLE的别名)。的别名)。值类型与引用类型区别值类型与引用类型区别6 6值类型:值类型:C#C#中的所有值类型变量在声明时都有初始值,然而没有明确中的所有值类型变量在声明时都有初始值,然而没有明确地初始化变量,地初始化变量,C#C#就禁止使用该变
5、量。就禁止使用该变量。如:如:bool married;bool married;Console.WriteLine(married);Console.WriteLine(married);则提示错误信息则提示错误信息“使未赋值的变量使未赋值的变量married”married”C#C#中可以将值类型声明为可空(中可以将值类型声明为可空(nullablenullable),意味着它可以暂),意味着它可以暂时没有值。时没有值。如:如:boolbool?married=nullmarried=null;或者或者Nullable married=null;Nullable married=null;
6、值类型与引用类型区别值类型与引用类型区别7 7引引用类型:用类型:1 1、数组(派生于数组(派生于SYSTEM.ARRAYSYSTEM.ARRAY)2 2、用户用定义的以下类型:用户用定义的以下类型:类:类:classclass(派生于(派生于SYSTEM.OBJECTSYSTEM.OBJECT););接口:接口:interfaceinterface(接口不存在派生于何处的问题。(接口不存在派生于何处的问题。3 3、委托:委托:delegatedelegate(派生于(派生于SYSTEM.DELEGATESYSTEM.DELEGATE)。)。4 4、ObjectObject(System.OB
7、JECTSystem.OBJECT的别名);的别名);5 5、字符串:字符串:stringstring(System.StringSystem.String的别名)。的别名)。值类型与引用类型区别值类型与引用类型区别8 8值类型与引用类型区别值类型与引用类型区别堆栈堆56ij实际数据12345Hobj图中i和j为值类型变量,obj为引用类型变量值类型的变量保存的是值类型的变量保存的是变量的值变量的值;引用类型的变量保存的是引用类型的变量保存的是数据的引用地址数据的引用地址。9 9引用类型分两步创建:首先在堆栈上创建一个引用变量,然后在堆上创建对象本身,再把这个内存的句柄(也是内存的首地址)赋给
8、引用变量 例如:string s1,s2;s1=ABCD;s2=s1;其中,s1,s2是指向字符串的引用变量,s1的值是字符串“ABCD”存放在内存的地址,这就是对字符串的引用,两个引用型变量之间的赋值,使得s2、s1都是对“ABCD”的引用。如下图所示。值类型与引用类型区别值类型与引用类型区别1010(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的值是多少
9、?的值是多少?值类型与引用类型区别值类型与引用类型区别1111值类型和引用类型的区别值类型和引用类型的区别 特性特性值类型值类型引用类型引用类型变量中保存的内容变量中保存的内容实际数据实际数据指向实际数据的引用指针指向实际数据的引用指针内存空间配置内存空间配置堆栈(堆栈(StackStack)受管制的堆(受管制的堆(Managed Managed HeapHeap)内存需求内存需求较少较少较多较多执行效率执行效率较快较快较慢较慢内存释放时间点内存释放时间点执行超过定义变量的执行超过定义变量的作用域时作用域时由垃圾回收机制负责回收由垃圾回收机制负责回收1212为什么要托管堆为什么要托管堆(受管制
10、的堆受管制的堆)?.NET框架包含一个托管堆,所有的.NET语言在分配引用类型对象时都要使用它。像值类型这样的轻量级对象始终分配在栈中,但是所有的类实例和数组都被生成在一个内存池中,这个内存池就是托管堆。垃圾收集器的基本算法很简单:将所有的托管内存标记为垃圾 寻找正被使用的内存块,并将他们标记为有效 释放所有没有被使用的内存块 整理堆以减少碎片1313相关面试题目相关面试题目 int k=5;int j=5;if(Object.ReferenceEquals(k,j)/判定判定k k和和j j是否是否为为同一个同一个实实例例 Console.WriteLine(Equal);else Cons
11、ole.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 14142.1.2 2.1.2 整型整型 uC#C#提供了八种整型(即计算机组成原理中的提供了八种整型(即计算机组成原理中的“定点数定点数”):):sbytesbyte:1 1字节有符号字节有符号 bytebyte:1 1字节无符号字节无符号 shor
12、tshort:2 2字节有符号字节有符号 ushortushort:2 2字节无符号字节无符号 intint:4 4字节有符号,最常用字节有符号,最常用 uintuint:4 4字节无符号字节无符号 longlong:8 8字节有符号字节有符号 ulongulong:8 8 字节无符号字节无符号 15152.1.3 2.1.3 浮点类型浮点类型 float:4字节浮点数,常用。例如:字节浮点数,常用。例如:35.0fdouble:8字节浮点数,常用。例如:字节浮点数,常用。例如:2.7E+23decimal:16字节浮点数,特殊的浮点数,精度高,适用于字节浮点数,特殊的浮点数,精度高,适用于金
13、融、货币等需要高精度数值的领域。其类型指定符为金融、货币等需要高精度数值的领域。其类型指定符为M(或(或m)。)。例如:例如:decimal y=9999999999999999999999999m;float和和double的浮点数格式与计算机组成原理介绍的的浮点数格式与计算机组成原理介绍的IEEE754规定的格式相同规定的格式相同1616C#中中所有非整数的数值所有非整数的数值始终被视为始终被视为双精度双精度,如果将非整数,如果将非整数的数值赋给的数值赋给float类型的变量,需要在该数之后附加类型的变量,需要在该数之后附加F或者或者f后后缀,否则会出现错误缀,否则会出现错误“不能隐式地将
14、不能隐式地将 Double 类型转换为类型转换为“float”类型;请使用类型;请使用“F”后缀创建此类型后缀创建此类型”。如如 float i=3.99f;同样需要使用同样需要使用M后缀将非整数值赋给后缀将非整数值赋给decimal变量变量如如 decimal d=4.56M;2.1.3 2.1.3 浮点类型浮点类型 17172.1.4 2.1.4 布尔型布尔型 u 用用boolbool表示,表示,boolbool类型只有两个值类型只有两个值truetrue和和falsefalse。例如:例如:bool isExist=false;bool isExist=false;bool b=(i0&
15、i0&i10);u注意注意 if(i)j+=10;/if(i)j+=10;/错误错误 if(j=15)j+=10;/if(j=15)j+=10;/错误错误 18182.1.5 2.1.5 字符型与字符串类型字符型与字符串类型 uchar型,为单个型,为单个Unicode字符,字符型常量必须用字符,字符型常量必须用单引号单引号引起引起来来。例如:例如:char ch=a;如果是字符串(单个字符的组合),对应的类型为如果是字符串(单个字符的组合),对应的类型为string。string类型的常量用双引号将字符串引起来。类型的常量用双引号将字符串引起来。例如:例如:string str=hello;
16、uchar和和string类型的常量均可以使用转义符。类型的常量均可以使用转义符。C#中中加在字符串前面,字符串中的加在字符串前面,字符串中的 失去转义符的作用,直失去转义符的作用,直接写字符串而不需要考虑转义字符,接写字符串而不需要考虑转义字符,如果在字符串中需用到双引号,则可连写两个双引号来表示一个双引号。pC:windowsMicrosoft /与 C:windowsMicrosoft 含义相同pHe saidHello to me /与He saidHello to me 含义相同1919转 义 字 符含 义转 义 字 符含 义单引号单引号b退格符退格符双引号双引号f走纸换页符走纸换页
17、符反斜线字符反斜线字符n换行符换行符0空字符空字符r回车符回车符a警铃符警铃符t水平制表符水平制表符v垂直制表符垂直制表符2.1.5 2.1.5 字符型与字符串类型字符型与字符串类型 20202.2 2.2 不同数据类型之间的转换不同数据类型之间的转换 u有两种转换方式:隐式转换与显式转换;有两种转换方式:隐式转换与显式转换;u如果是不同值类型之间的转换,可以使用如果是不同值类型之间的转换,可以使用ConvertConvert类类提供的静态方法。提供的静态方法。21212.2.1 2.2.1 隐式转换和显式转换隐式转换和显式转换u隐式转换:隐式转换:系统默认的,不需要加以声明就可以进行的转换。
18、系统默认的,不需要加以声明就可以进行的转换。从低精度、小范围的数据类型转换为高精度、大范围的数据从低精度、小范围的数据类型转换为高精度、大范围的数据类型,可以用隐式转换。类型,可以用隐式转换。例如:例如:int k=1;int k=1;long i=2;long i=2;i=k;/i=k;/隐式转换隐式转换22222.2.1 2.2.1 隐式转换和显式转换隐式转换和显式转换u显式转换:显式转换:也称为强制转换。用户必须明确地指定转换的类也称为强制转换。用户必须明确地指定转换的类型型。例如:例如:long k=2147483649;long k=2147483649;int i=(int)k;i
19、nt i=(int)k;所有的隐式转换也都可以采用显式转换的形式来表示。如:所有的隐式转换也都可以采用显式转换的形式来表示。如:int i=10;int i=10;long j=(long)i;long j=(long)i;将大范围类型的数据转换为小范围类型的数据的时候,属将大范围类型的数据转换为小范围类型的数据的时候,属于显式转换,另外还必须特别谨慎,因为此时有丢失数据于显式转换,另外还必须特别谨慎,因为此时有丢失数据的危险。的危险。2323例题例题下面声明了一些数值类型的变量:下面声明了一些数值类型的变量:short svalue;int ivalue;uint uvalue;long l
20、value;double dvalue;float fvalue;在对各个变量赋过初值之后,试分析下面哪些转换是正确的,哪些是错误的,在对各个变量赋过初值之后,试分析下面哪些转换是正确的,哪些是错误的,并写出解决办法。并写出解决办法。1)svalue=uvalue;/无法将类型无法将类型“uint”隐式转换为隐式转换为“short”。存在一个。存在一个显式转换显式转换(是否缺少强制转换是否缺少强制转换?)错误;错误;svalue=(short)uvalue;2)lvalue=svalue;正确正确 3)fvalue=dvalue;错误;错误;fvalue=(float)dvalue;4)lva
21、lue=dvalue;错误错误;lvalue=(long)dvalue;24242.2.2 2.2.2 装箱与拆箱装箱与拆箱P22P22uObjectObject类型:所有其他引用类型的基类。类型:所有其他引用类型的基类。m装箱:将值类型转换为装箱:将值类型转换为objectobject类型类型 int i=123;int i=123;object o=i;object o=i;m拆箱:显式地将拆箱:显式地将objectobject类型转换为值类型类型转换为值类型 int i=123;int i=123;Object box=i;/Object box=i;/装箱操作装箱操作 int k=(i
22、nt)box;/int k=(int)box;/拆箱操作拆箱操作m装装箱箱和和拆拆箱箱是是互互逆逆的的过过程程,但但是是必必须须要要注注意意,装装箱箱和和拆拆箱箱必必须满足类型兼容的原则。须满足类型兼容的原则。2525装箱时它首先创建一个对象实例,然后把值类型的值装箱时它首先创建一个对象实例,然后把值类型的值复制到这个对象实例,最后由复制到这个对象实例,最后由objectobject对象引用这个对对象引用这个对象实例象实例。例如:using System;class Demo public static void Main()int x=123;object obj1=x;/装箱操作 x=x+
23、100;/改变x的值,此时obj1的值并不会随之改变 Console.WriteLine(x=0,x);/x=223 Console.WriteLine(obj1=0,obj1);/obj1=123 2.2.2 2.2.2 装箱与拆箱装箱与拆箱2626 拆箱操作与装箱相反,它是将一个拆箱操作与装箱相反,它是将一个objectobject类型转换成值类类型转换成值类型。首先检查由型。首先检查由objectobject引用的对象实例值类型的包装值,然后引用的对象实例值类型的包装值,然后把实例中的值拷贝到值类型的变量中。把实例中的值拷贝到值类型的变量中。class Demo public stati
24、c void Main()int x=123,y;object obj1=x;/装箱操作 x=x+100;/改变x的值,此时obj1的值并不会随之改变 y=(int)obj1;/拆箱操作,必须进行强制类型转换 Console.WriteLine(x=0,x);/x=223 Console.WriteLine(obj1=0,obj1);/obj1=123 Console.WriteLine(y=0,y);Console.WriteLine(y=0,y);2.2.2 2.2.2 装箱与拆箱装箱与拆箱27272.3 2.3 常量和变量常量和变量C#C#中提供中提供2 2种类型的常量:种类型的常量:u
25、使用使用constconst关键字声明关键字声明(const const 字段只能在该字段的声明中初始化。字段只能在该字段的声明中初始化。)constconst常量是在常量是在编译时编译时设置其值并且设置其值并且永远永远不能更改其值的字段,在不能更改其值的字段,在对程序进行编译的时候,编译器会把所有对程序进行编译的时候,编译器会把所有constconst常量全部替换为常常量全部替换为常数。数。const double PI=3.14;const double PI=3.14;u使用使用readonlyreadonly关键字声明关键字声明 readonlyreadonly关键字在程序运行期间只能
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 数据类型 流程 控制
限制150内