版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 变 量,在C#语言中,变量就是一个数据存储空间的表示。根据不同的数据类型,在内存中给变量分配合适的空间。为了便于找到该内存空间的位置,给这个内存起的名字就是变量名。每一个变量的值由其类型确定。本章将讲解C#语言中各种变量,主要介绍的知识点有变量的变量分类、变量赋值、变量转换等,4.1 什么是变量,在C#语言中,变量表示存储位置。每一个变量都具有一个类型,该类型确定变量存储的内容。对于两个变量而言,如果它们的值相同,但是类型不同,那么该变量存储的值是不相同的。C#中的所有变量在使用前必须先声明,这样C#编译器才能进行严格的类型检查。,【示例4-1】下面声明两个变量v1和v2,它们的值都为
2、2012。但是v1变量的类型为int,而v2变量的类型为object。因此,v1和v2变量存储的值是不相同的。v1变量直接存储2012这一个值,而v2变量存储访问2012这个值的地址,如下图所示。 int v1 = 2012; object v2 = 2012;,注意:由于C#是一种类型安全的语言,C#编译器总是能够保证存储在变量中的值具有合适的类型。 声明一个变量之后,该变量可能具有初始值,也可能不具有初始值。如果变量具有初始值,则称之为初始已赋值(initially assigned)。如果变量不具有初始值,则称之为初始未赋值(initially unassigned)。,【示例4-2】下
3、面声明两个变量v1和v2。v1变量是一个初始已赋值变量,那是因为int类型具有默认初始值0。v2变量是一个初始未赋值变量,那是因为object类型不具有默认初始值。 int v1; /声明int型的变量v1 object v2; /声明object型变量v2 Console.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型的变量v1 object v2; /声明object型变量v2 v1 = 10; /为v1变量赋值为10 v2 = 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; /定义静态变量s 02int v; /定义int型变量v 03void F(int a, int i, ref int r
6、, out int o) 04 /定义数组a,值参数i,引用参数r,输出参数o 05 06 int j = i; /声明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 c
7、ount; /声明count静态变量,它的初始值为0 静态变量都具有初始值,即是该变量的类型的默认值。示例4-5中的count变量的初始值是int类型的默认值0。如果静态变量的类型为引用类型,那么它的初始值为null。,【示例4-6】下面声明一个名称为o的静态变量,它的类型为object。 static object o; /声明静态变量o Console.Write(o); /输出o变量的值 分析:o是一个静态变量,它的默认值为null,Console.Write(o)语句将输出一个空字符串。 每一个变量都有一个声明周期,静态变量也一样。静态变量一般在程序编译之后就存在了,它总是在包含了它的
8、那个类型的静态构造函数执行之前就存在了,在关联的应用程序域终止时终止。,【示例4-7】下面创建一个名称为Program的类,并声明了sum静态变量,它的类型为int,且它的默认值为0。Count()函数将sum静态变量的值增1。 01class Program 02 03 static int sum; /声明sum静态变量,它的初始值为0 04 static void Main(string args) 05 06 Count(); 07 Console.WriteLine(sum); /输出sum静态变量的值 08 09 static void Count() 10 11 sum+; /s
9、um静态变量的值增1 12 13,分析:程序主入口Main(string args)函数首先调用Count()函数将sum静态变量的值增1,然后将sum静态变量的值输出在控制台,此时它的值为1。,4.2.2 实例变量,实例变量是指在使用该变量三时才进行内存分配的变量。这类变量刚好和静态变量相反。 1类的实例变量 类的实例变量是在类中声明的变量,通过创建的类的实例来访问。对于实例变量,只有在对象被实例化之后,才会拥有一个值,并被分配到属于自己的存储空间。类的实例变量存在于类的实例创建开始到该实例被释放。,【示例4-8】下面声明一个名称为Program的类,并在该类中声明了一个名称为count的实
10、例变量,它的类型为int。 01class Program 02 03 int count; /声明一个实例变量count 04 /省略了其他代码 05 分析:count变量就是一个类的实例变量,它的初始值为int类型的默认初始值0。 注意:类的实例变量和静态变量一样,也具有初始值,且它的初始值为该变量的类型的默认值。,2结构的实例变量 结构的实例变量是在结构中声明的变量,它随着结构的存在而存在。即它的生存周期和它所在的结构的生存周期相同。 【示例4-9】下面声明一个名称为Program的结构,并在该结构中声明了一个名称为count的实例变量,它的类型为int。 01struct Progra
11、m 02 03 int count; /声明一个实例变量count 04 /省略了其他代码 05,分析:count变量就是一个结构的实例变量,它的初始值为int类型的默认初始值0。 注意:结构的实例变量与它所在结构变量具有相同的初始赋值状态。也就是说,如果它所在结构变量本身是具有初始值时,该结构的实例变量也是具有初始值的。反之,也一样不具有初始值。,4.2.3 局部变量,局部变量是指在一个独立的程序块中声明的变量,它只在该程序块中有效。局部变量可以声明在块、for语句、switch语句或者using语句中。当程序运行到这一程序块中,该变量开始生效,离开即失效。,【示例4-10】下面在F()函数
12、中声明一个名称为j的局部变量,并设置其初始值为0。 void F() int j = 0; /声明一个局部变量j j+; /j的值增1 分析:j局部变量的初始值为0,“j+;”语句使得j局部变量的值增1。,局部变量的生存期是应用程序执行过程中的某一“段”时间。在此期间,应用程序会为该局部变量保留存储控件。局部变量的生存期是从声明该变量开始,一直到它所在的块或for语句或switch语句或using语句结束。 注意:局部变量不会自动初始化,因此,它不具有初始值。如果要使用该局部变量,则必须对该局部变量执行赋值。,4.2.4 值参数,值参数是指方法参数的一种,是声明时不带修饰符的参数。一个值参数相
13、当于一个局部变量,只是它的初始值来自该方法调用所提供的相应参数。在内存中为值参数分配了一块新的存储空间。 【示例4-11】下面在F(int i)函数中声明一个名称为i的参数,该参数的类型为int。 int F(int i) /声明一个值参数变量i /省略了其他代码 return i; ,值参数的声明周期和它所在的函数成员相关。当它所在的函数成员被调用时,值参数开始存在,并在该函数成员调用中使用给定的实参的值进行初始化。当该函数成员返回时,值参数停止存在。 【示例4-12】下面调用F(int i)函数,返回值保存为count变量。 int count = F(10); /声明一个局部变量coun
14、t 分析:调用F(int i)函数的实参的值(10)将来作为F(int i)函数的值参数i的初始值。,4.2.5 引用参数,引用参数是指方法的用ref修饰符声明的参数。引用参数不创建新的存储位置,即引用参数和其基础变量操作的是同一个变量。 【示例4-13】下面在F(ref int i,int 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的和。 在调
15、用包含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.WriteLine(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)。此时,“Con
16、sole.WriteLine(i);”语句输出i变量的值为9。,注意:由于i变量作为F(ref int i,int j)函数的ref参数,因此,F(ref int i,int j)函数中的“i-;”语句在修改i参数的值的同时也修改i变量的值。 使用ref参数需要注意以下两个方面。 变量在可以作为ref参数在函数成员调用中传递之前,必须已明确赋值的。 在函数成员内部,ref参数被视为初始已赋值的。 注意:如果希望在函数中执行指定操作的同时也修改参数的值,使用ref参数是一个比较好的选择。,4.2.6 输出参数,输出参数是方法中用out修饰符声明的参数。输出参数类似于引用参数,也不创建新的存储位置
17、。因此,输出参数的值总是与基础变量相同。在调用包含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 = j; return i + j; /返回i和j的和 分析:“j-;”语句把j参数的值减1,“i = j;”语句将j变量的值赋值给i变量,“return i + j;”语句返回i和j的和。 在调用包含out参数的函数成员时,必须也要在out
18、参数之前添加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(int j,out int i)函数之内。当调用F(int j,out int i)函数之后,i变量的值被修改。此时,“Console.WriteLine(i);”语句输出i变量的值为99。 注意:
19、由于i变量作为F(int j,out int i)函数的out参数,因此,F(int j,out int i)函数中的“i = j;”语句在修改i参数的值的同时也修改i变量的值。,使用out参数需要注意以下三个方面: 变量在可以作为输出参数在函数成员调用中传递之前不一定要明确赋值。示例4-16中的i变量就没有明确指定其初始值。 在函数成员内部,out参数被视为初始未赋值的。 函数成员的每个输出参数在该函数成员正常返回前都必须是已明确赋值的。 注意:如果希望一个函数成员能够返回多个结果,则使用out参数是一个比较好的选择。如F(out int i, out int j,out int k)函数就
20、使用了out参数返回了3个值。,4.2.7 数组元素,当用数组元素作为方法参数时,它们和数组的生存周期相同。在创建数组实例时开始存在,直到没有对该数组实例的引用时结束。每个数组元素的初始值是其数组类型的默认值。 【示例4-17】下面在F(int values)函数声明1个数组参数:values。该参数的元素的类型为int,它的每一个元素都为数组元素。 void F(int values) /声明一个数组values作为函数的参数 /省略了代码 ,4.3 对 变 量 赋 值,变量赋值是指给变量指定一个明确的值。变量赋值可以出现在声明变量时,类的构造函数中等。如果编译器可确定变量已自动初始化或已成
21、为至少一个赋值的目标,则称该变量已明确赋值。如果变量未赋值,编译时将会报错。 【示例4-18】下面声明2个变量。其中,i变量赋值为10,j变量赋值为2012。 int i; /声明i变量 i = 10; /为i变量赋值10 int j = 2012; /声明j变量,并赋值为2012,一旦变量被声明之后,该变量可能是初始已赋值的(具有有初始值),也可能是初始未赋值的(不具有初始值)。以下7类中的变量属于初始已赋值的变量。 静态变量; 类实例的实例变量; 初始已赋值结构变量的实例变量; 数组元素; 值参数; 引用参数; 在catch子句或foreach语句(第6章)中声明的变量。,以下3类中的变量
22、属于初始未赋值的变量。 初始未赋值结构变量的实例变量; 输出参数; 局部变量,在catch子句或foreach语句(第6章)中声明的那些除外。,4.4 变 量 转 换,变量转换是指把变量从一种类型转换成另一种类型。变量的转换分为隐式转换和显式转换。本节将介绍变量转换的两种方式。,4.4.1 隐式转换,隐式转换是指可以自动进行的转换。编译时编译器会自动将变量类型转换为指定的类型。 【示例4-19】下面声明两个变量:a和b。a变量的类型为int、值为10。b变量的类型为long,它的值和a变量的值相等。“b = a;”语句为b变量赋值,并将a变量的类型隐式转换为b变量的类型,即将a变量的值可以隐式
23、地按照b变量的类型来处理。 int a = 10; long b = a; /int类型隐式转换为long类型,常用的隐式转换包括以下几种。 标识转换:在同一类型内进行转换,它能够使已具有所需类型的实体可被认为是可转换的。 隐式数值转换:如从int类型转换为long类型等。 隐式枚举转换:将数值转换为枚举类型。 隐式引用转换:如引用类型转换为object类型等。 装箱转换:如值类型转换为object类型等。 隐式常量表达式转换:如将int类型转换为uint类型等。,用户定义隐式转换,包括以下3个步骤。 (1)一个标准的隐式转换; (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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 民宿企业内部治安管理制度
- 济南行政单位内部控制制度
- 海康威视内部管理制度
- 烘焙业内部合伙制度
- 煤矿内部市场结算制度范本
- 煤矿调度内部制度
- 环保局科室内部制度
- 理财销售内部责任制度
- 监测站内部审计制度汇编
- 监理内部组织培训制度
- 滑板基础施工方案(3篇)
- 2025-2030中国化工新材料资源开发与绿色化学循环经济发展提议
- 财务咨询服务合同协议2025
- 2025版 全套200MW800MWh独立储能项目EPC工程概算表
- 热性惊厥临床指南
- 中医药科研课题申报技巧
- 2025ACG临床指南:成人溃疡性结肠炎(更新版)课件
- 2025高中历史时间轴与大事年表
- 2026年江苏农林职业技术学院单招职业适应性测试必刷测试卷新版
- 2025年重庆选调生申论真题参考答案
- 滴灌带生产流程
评论
0/150
提交评论