零点起飞学C#之变量

上传人:仙*** 文档编号:240570782 上传时间:2024-04-17 格式:PPTX 页数:44 大小:252.53KB
收藏 版权申诉 举报 下载
零点起飞学C#之变量_第1页
第1页 / 共44页
零点起飞学C#之变量_第2页
第2页 / 共44页
零点起飞学C#之变量_第3页
第3页 / 共44页
资源描述:

《零点起飞学C#之变量》由会员分享,可在线阅读,更多相关《零点起飞学C#之变量(44页珍藏版)》请在装配图网上搜索。

1、第4章 变 量在C#语言中,变量就是一个数据存储空间的表示。根据不同的数据类型,在内存中给变量分配合适的空间。为了便于找到该内存空间的位置,给这个内存起的名字就是变量名。每一个变量的值由其类型确定。本章将讲解C#语言中各种变量,主要介绍的知识点有变量的变量分类、变量赋值、变量转换等4.1 什么是变量在C#语言中,变量表示存储位置。每一个变量都具有一个类型,该类型确定变量存储的内容。对于两个变量而言,如果它们的值相同,但是类型不同,那么该变量存储的值是不相同的。C#中的所有变量在使用前必须先声明,这样C#编译器才能进行严格的类型检查。【示例4-1】下面声明两个变量v1和v2,它们的值都为2012

2、。但是v1变量的类型为int,而v2变量的类型为object。因此,v1和v2变量存储的值是不相同的。v1变量直接存储2012这一个值,而v2变量存储访问2012这个值的地址,如下图所示。int v1=2012;object v2=2012;注意:由于C#是一种类型安全的语言,C#编译器总是能够保证存储在变量中的值具有合适的类型。声明一个变量之后,该变量可能具有初始值,也可能不具有初始值。如果变量具有初始值,则称之为初始已赋值(initially assigned)。如果变量不具有初始值,则称之为初始未赋值(initially unassigned)。【示例4-2】下面声明两个变量v1和v2。

3、v1变量是一个初始已赋值变量,那是因为int类型具有默认初始值0。v2变量是一个初始未赋值变量,那是因为object类型不具有默认初始值。int v1;/声明int型的变量v1object v2;/声明object型变量v2Console.Write(v1);/输出v1变量的值Console.Write(v2);/编译出错,v2变量未赋值“Console.Write(v1);”语句将v1变量的值(0)输出在控制台上。“Console.Write(v2);”语句将为产生编译错误,那是因为v2变量未赋值,不能使用。注意:变量是初始已赋值还是初始未赋值的,由该变量的类型决定。如果变量的类型有默认初始

4、值,则该变量是初始已赋值的,否则为初始未赋值的。一般情况下,所有值类型都具有默认初始值,而所有引用类型是没有默认初始值。如果是第一次明确指定变量的值,则称之为变量的初始化。如果是初始未赋值变量,必须经过初始化之后,才能够被使用。【示例4-3】下面声明两个变量v1和v2。“v1=10;”语句初始化v1变量的值为10。“v2=10;”语句初始化v2变量的值为10。int v1;/声明int型的变量v1object v2;/声明object型变量v2v1=10;/为v1变量赋值为10v2=10;/为v2变量赋值为10注意:如果可以获取某一个变量的值,那么该变量必须是已明确赋值的,即该变量已经被初始化

5、。4.2 变量的类型由于变量所要表达的数据不同,变量可以分为7种:静态变量、实例变量、数组元素、值参数、引用参数、输出参数和局部变量。本节将详细介绍这7种类别的变量。【示例4-4】下面声明7个变量:s、v、a、i、r、o和j,而且这7个变量的类别各不相同。s是静态变量,v是实例变量,a0是数组元素,i是值参数,r是引用参数,o是输出参数,j是局部变量。01static int s;/定义静态变量s02int v;/定义int型变量v03void F(int a,int i,ref int r,out int o)04 /定义数组a,值参数i,引用参数r,输出参数o0506 int j=i;/声

6、明j变量,并赋值07 o=v+r;/计算v和r变量的和,并赋值给o变量08分析:s是一个静态变量,它的默认值为0;v是一个实例变量,它的默认值也为0。F是一个函数,a、i、r和o都是该函数的参数。a是一个数组,r是ref参数,o是out参数。j是一个局部变量。4.2.1 静态变量静态变量是指从程序开始运行,就被分配内存空间的变量。这类变量使用static修饰。【示例4-5】下面声明一个名称为count的静态变量,它的类型为int。static int count;/声明count静态变量,它的初始值为0静态变量都具有初始值,即是该变量的类型的默认值。示例4-5中的count变量的初始值是int

7、类型的默认值0。如果静态变量的类型为引用类型,那么它的初始值为null。【示例4-6】下面声明一个名称为o的静态变量,它的类型为object。static object o;/声明静态变量oConsole.Write(o);/输出o变量的值分析:o是一个静态变量,它的默认值为null,Console.Write(o)语句将输出一个空字符串。每一个变量都有一个声明周期,静态变量也一样。静态变量一般在程序编译之后就存在了,它总是在包含了它的那个类型的静态构造函数执行之前就存在了,在关联的应用程序域终止时终止。【示例4-7】下面创建一个名称为Program的类,并声明了sum静态变量,它的类型为in

8、t,且它的默认值为0。Count()函数将sum静态变量的值增1。01class Program0203 static int sum;/声明sum静态变量,它的初始值为004 static void Main(string args)05 06 Count();07 Console.WriteLine(sum);/输出sum静态变量的值08 09 static void Count()10 11 sum+;/sum静态变量的值增112 13分析:程序主入口Main(string args)函数首先调用Count()函数将sum静态变量的值增1,然后将sum静态变量的值输出在控制台,此时它的值

9、为1。4.2.2 实例变量实例变量是指在使用该变量三时才进行内存分配的变量。这类变量刚好和静态变量相反。1类的实例变量类的实例变量是在类中声明的变量,通过创建的类的实例来访问。对于实例变量,只有在对象被实例化之后,才会拥有一个值,并被分配到属于自己的存储空间。类的实例变量存在于类的实例创建开始到该实例被释放。【示例4-8】下面声明一个名称为Program的类,并在该类中声明了一个名称为count的实例变量,它的类型为int。01class Program0203 int count;/声明一个实例变量count04 /省略了其他代码05分析:count变量就是一个类的实例变量,它的初始值为in

10、t类型的默认初始值0。注意:类的实例变量和静态变量一样,也具有初始值,且它的初始值为该变量的类型的默认值。2结构的实例变量结构的实例变量是在结构中声明的变量,它随着结构的存在而存在。即它的生存周期和它所在的结构的生存周期相同。【示例4-9】下面声明一个名称为Program的结构,并在该结构中声明了一个名称为count的实例变量,它的类型为int。01struct Program0203 int count;/声明一个实例变量count04 /省略了其他代码05分析:count变量就是一个结构的实例变量,它的初始值为int类型的默认初始值0。注意:结构的实例变量与它所在结构变量具有相同的初始赋值

11、状态。也就是说,如果它所在结构变量本身是具有初始值时,该结构的实例变量也是具有初始值的。反之,也一样不具有初始值。4.2.3 局部变量局部变量是指在一个独立的程序块中声明的变量,它只在该程序块中有效。局部变量可以声明在块、for语句、switch语句或者using语句中。当程序运行到这一程序块中,该变量开始生效,离开即失效。【示例4-10】下面在F()函数中声明一个名称为j的局部变量,并设置其初始值为0。void F()int j=0;/声明一个局部变量j j+;/j的值增1分析:j局部变量的初始值为0,“j+;”语句使得j局部变量的值增1。局部变量的生存期是应用程序执行过程中的某一“段”时间

12、。在此期间,应用程序会为该局部变量保留存储控件。局部变量的生存期是从声明该变量开始,一直到它所在的块或for语句或switch语句或using语句结束。注意:局部变量不会自动初始化,因此,它不具有初始值。如果要使用该局部变量,则必须对该局部变量执行赋值。4.2.4 值参数值参数是指方法参数的一种,是声明时不带修饰符的参数。一个值参数相当于一个局部变量,只是它的初始值来自该方法调用所提供的相应参数。在内存中为值参数分配了一块新的存储空间。【示例4-11】下面在F(int i)函数中声明一个名称为i的参数,该参数的类型为int。int F(int i)/声明一个值参数变量i /省略了其他代码 re

13、turn i;值参数的声明周期和它所在的函数成员相关。当它所在的函数成员被调用时,值参数开始存在,并在该函数成员调用中使用给定的实参的值进行初始化。当该函数成员返回时,值参数停止存在。【示例4-12】下面调用F(int i)函数,返回值保存为count变量。int count=F(10);/声明一个局部变量count分析:调用F(int i)函数的实参的值(10)将来作为F(int i)函数的值参数i的初始值。4.2.5 引用参数引用参数是指方法的用ref修饰符声明的参数。引用参数不创建新的存储位置,即引用参数和其基础变量操作的是同一个变量。【示例4-13】下面在F(ref int i,int

14、 j)函数声明两个参数:i和j。其中,i参数为ref参数,j参数为值参数。int F(ref int i,int j)/声明一个引用参数i i-;/i的值减1 return i+j;/返回i和j的和分析:“i-;”语句把i参数的值减1,“return i+j;”语句返回i和j的和。在调用包含ref参数的函数成员时,必须也要在ref参数之前添加ref修饰符。【示例4-14】下面调用F(ref int i,int j)函数,返回值保存为sum变量。其中,i为基础变量。int i=10;int sum=F(ref i,100);/调用F(ref int i,int j)函数Console.Write

15、Line(i);/输出i变量的值分析:i变量的值为10,它作为F(ref int i,int j)函数的ref参数并传递到F(ref int i,int j)函数之内。当调用F(ref int i,int j)函数之后,i变量的值被修改(即被减1)。此时,“Console.WriteLine(i);”语句输出i变量的值为9。注意:由于i变量作为F(ref int i,int j)函数的ref参数,因此,F(ref int i,int j)函数中的“i-;”语句在修改i参数的值的同时也修改i变量的值。使用ref参数需要注意以下两个方面。变量在可以作为ref参数在函数成员调用中传递之前,必须已明确

16、赋值的。在函数成员内部,ref参数被视为初始已赋值的。注意:如果希望在函数中执行指定操作的同时也修改参数的值,使用ref参数是一个比较好的选择。4.2.6 输出参数输出参数是方法中用out修饰符声明的参数。输出参数类似于引用参数,也不创建新的存储位置。因此,输出参数的值总是与基础变量相同。在调用包含out参数的函数成员时,该函数成员将在这一个存储位置存储新的值,并修改基础变量的值。【示例4-15】下面在F(int j,out int i)函数声明两个参数:i和j。其中,i参数为out参数,j参数为值参数。int F(int j,out int i)/声明一个输出变量i j-;/j的值减1 i=

17、j;return i+j;/返回i和j的和分析:“j-;”语句把j参数的值减1,“i=j;”语句将j变量的值赋值给i变量,“return i+j;”语句返回i和j的和。在调用包含out参数的函数成员时,必须也要在out参数之前添加out修饰符。【示例4-16】下面调用F(ref int i,int j)函数,返回值保存为sum变量。其中,i为基础变量。int i;int sum=F(100,out i);/调用F(int j,out int i)函数Console.WriteLine(i);/输出i变量的值分析:i为基础变量,它作为F(int j,out int i)函数的out参数并传递到F

18、(int j,out int i)函数之内。当调用F(int j,out int i)函数之后,i变量的值被修改。此时,“Console.WriteLine(i);”语句输出i变量的值为99。注意:由于i变量作为F(int j,out int i)函数的out参数,因此,F(int j,out int i)函数中的“i=j;”语句在修改i参数的值的同时也修改i变量的值。使用out参数需要注意以下三个方面:变量在可以作为输出参数在函数成员调用中传递之前不一定要明确赋值。示例4-16中的i变量就没有明确指定其初始值。在函数成员内部,out参数被视为初始未赋值的。函数成员的每个输出参数在该函数成员正

19、常返回前都必须是已明确赋值的。注意:如果希望一个函数成员能够返回多个结果,则使用out参数是一个比较好的选择。如F(out int i,out int j,out int k)函数就使用了out参数返回了3个值。4.2.7 数组元素当用数组元素作为方法参数时,它们和数组的生存周期相同。在创建数组实例时开始存在,直到没有对该数组实例的引用时结束。每个数组元素的初始值是其数组类型的默认值。【示例4-17】下面在F(int values)函数声明1个数组参数:values。该参数的元素的类型为int,它的每一个元素都为数组元素。void F(int values)/声明一个数组values作为函数的

20、参数 /省略了代码4.3 对 变 量 赋 值变量赋值是指给变量指定一个明确的值。变量赋值可以出现在声明变量时,类的构造函数中等。如果编译器可确定变量已自动初始化或已成为至少一个赋值的目标,则称该变量已明确赋值。如果变量未赋值,编译时将会报错。【示例4-18】下面声明2个变量。其中,i变量赋值为10,j变量赋值为2012。int i;/声明i变量i=10;/为i变量赋值10int j=2012;/声明j变量,并赋值为2012一旦变量被声明之后,该变量可能是初始已赋值的(具有有初始值),也可能是初始未赋值的(不具有初始值)。以下7类中的变量属于初始已赋值的变量。静态变量;类实例的实例变量;初始已赋

21、值结构变量的实例变量;数组元素;值参数;引用参数;在catch子句或foreach语句(第6章)中声明的变量。以下3类中的变量属于初始未赋值的变量。初始未赋值结构变量的实例变量;输出参数;局部变量,在catch子句或foreach语句(第6章)中声明的那些除外。4.4 变 量 转 换变量转换是指把变量从一种类型转换成另一种类型。变量的转换分为隐式转换和显式转换。本节将介绍变量转换的两种方式。4.4.1 隐式转换隐式转换是指可以自动进行的转换。编译时编译器会自动将变量类型转换为指定的类型。【示例4-19】下面声明两个变量:a和b。a变量的类型为int、值为10。b变量的类型为long,它的值和a

22、变量的值相等。“b=a;”语句为b变量赋值,并将a变量的类型隐式转换为b变量的类型,即将a变量的值可以隐式地按照b变量的类型来处理。int a=10;long b=a;/int类型隐式转换为long类型常用的隐式转换包括以下几种。标识转换:在同一类型内进行转换,它能够使已具有所需类型的实体可被认为是可转换的。隐式数值转换:如从int类型转换为long类型等。隐式枚举转换:将数值转换为枚举类型。隐式引用转换:如引用类型转换为object类型等。装箱转换:如值类型转换为object类型等。隐式常量表达式转换:如将int类型转换为uint类型等。用户定义隐式转换,包括以下3个步骤。(1)一个标准的隐

23、式转换;(2)执行用户定义的隐式转换运算符;(3)另一个标准的隐式转换。4.4.2 显式转换显式转换是指需要添加强制转换的类型的转换。显示转换需要添加强制转换的类型,编译器不能自动将变量转换为指定类型。【示例4-20】下面声明两个变量:a和b。a变量的类型为long、值为10。b变量的类型为int,它的值和a变量的值相等。“b=(int)a;”语句为b变量赋值,并将a变量的类型显式转换为b变量的类型,即将a变量的值可以隐式地按照b变量的类型来处理。long a=10;int b=(int)a;/long类型显式转换为int类型注意:显式转换时需要添加强制转换的类型。如“b=(int)a;”语句

24、中的“int”就是强制转换后的类型。常用的显式转换包括以下几种。显式数值转换:如long类型转换为int类型等。显式枚举转换:如int类型转换为枚举类型等。显式引用转换:如object类型转换为引用类型等。显式接口转换:如object类型转换为接口类型等。拆箱转换:如object类型转换为值类型等。用户定义显式转换,包括以下3个步骤。(1)一个标准的显式转换;(2)执行用户定义的隐式或显式转换运算符;(3)另一个标准的显式转换。在显式转换中,除了添加强制转换的类型方式之外,还可以使用as运算符实现显式转换。as运算符能够将一个值显式地转换为一个给定的引用类型。as运算符的语法如下:e as T

25、;其中,e必须为表达式,T必须为引用类型。该表达式的运算结果的类型为T,如果转换失败,则返回null。【示例4-21】下面声明两个变量:o和t。o变量的类型为object、值为10。t变量的类型为T,它的值和o变量的值相等。“t=o as T;”语句为t变量赋值,并将o变量的类型使用as运算符显式转换为t变量的类型,即将o变量的值可以显式地按照t变量的类型来处理。object o=10;T t=o as T;/o类型显式转换为T类型注意:与强制转换表达式(添加强制转换的类型的表达式)相比,as运算符从不引发异常。如果指定的转换不可能实施,则运算结果为null。4.5 小 结本章主要介绍了C#语言中的变量的基础知识,如变量的定义、变量分类、变量赋值、值参数、ref参数、out参数、变量转换等。其中,重点是掌握变量赋值、值参数、ref参数、out参数,为后续编写C#程序代码奠定基础。难点是理解变量的转换。第5章将要介绍C#语言中的表达式和运算符。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!