3.2 变量
如本章的引言所述,变量关系到数据的存储。实际上,可以把计算机内存中的变量看作架子上的盒子。在这些盒子中,可以放入一些东西,再把它们取出来,或者只是看看盒子里是否有东西。变量也是这样,数据可放在变量中,可以从变量中取出数据或查看它们。
尽管计算机中的所有数据都是相同的东西(一组0和1),但变量有不同的内涵,称为类型。下面再使用盒子来类比,盒子有不同的形状和尺寸,某些东西只能放在特定的盒子中。建立这个类型系统的原因是,不同类型的数据需要用不同的方法来处理。变量限定为不同的类型,可以避免混淆它们。例如,组成数字图片的0和1序列与组成声音文件的0和1序列,其处理方式是不同的。
要使用变量,需要声明它们。即给变量指定名称和类型。声明了变量后,就可以把它们用作存储单元,存储声明的数据类型的数据。
声明变量的C#语法是,指定类型和变量名,如下所示:
type name; |
如果使用未声明的变量,代码就不会编译,但此时编译器会告诉我们发生了什么问题,所以这不是一个灾难性错误。另外,使用未赋值的变量也会产生一个错误,编译器会检测出这个错误。
那么我们可以使用什么类型呢?
实际上,可以使用的变量类型是无限多的。其原因是可以自己定义类型,存储各种复杂的数据。
尽管如此,总有一些数据类型是每个人都要使用的,例如存储数值的变量。因此我们应了解一些简单的预定义类型。
3.2.1 简单类型
简单类型就是组成应用程序中基本组成部件的类型,例如数值和布尔值(true或false)。简单类型还可以组成比较复杂的类型。大多数简单类型都是存储数值的,初看起来有点奇怪,肯定只需要一种类型存储数值吗?
数值类型过多的原因是在计算机内存中,把数字作为一系列的0和1来存储的机制。对于整数值,用一定的位(单个数字,可以是0或1)来存储,用二进制格式来表示。以N位来存储的变量可以表示任何介于0 到 (2N - 1)之间的数。大于这个值的数太大,不能存储在这个变量中。
例如,有一个变量存储了2位,在整数和表示该整数的位之间的映射应如下所示:
0 = 00
1 = 01
2 = 10
3 = 11
如果要存储更大的数,就需要更多的位(例如,3位可以存储0~7的数)。
这个论点的结论是要存储每个可以想像得到的数,就需要非常多的位,这并不适合PC。即使可以用足够多的位来表示每一个数,变量使用这些位来存储它,其效率也非常低下,例如,只需要存储从0到10之间的数 (因为存储器被浪费了)。其实4位就足够了,可以用相同的内存空间存储这个范围内的更多数值。
相反,许多不同的整数类型可以用于存储不同范围的数值,占用不同的内存空间(至多64位),其列表如表3-1所示。
表 3-1
|
类 型 |
别 名 |
允 许 的 值 |
|
sbyte |
System.SByte |
在 –128~127之间的整数 |
|
byte |
System.Byte |
在0~255之间的整数 |
|
short |
System.Int16 |
在–32768~32767之间的整数 |
|
ushort |
System.UInt16 |
在0 ~65535之间的整数 |
|
int |
System.Int32 |
在–2147483648~ 2147483647之间的整数 |
|
uint |
System.UInt32 |
在0~4294967295之间的整数 |
|
long |
System.Int64 |
在–9223372036854775808~9223372036854775807之间的整数 |
|
ulong |
System.UInt64 |
在0~18446744073709551615之间的整数 |
注意:
这些类型中的每一种都利用了.NET Framework中定义的标准类型。如第1章所述,使用标准类型可以在语言之间交互操作。在C#中这些类型的名称是Framework中定义的别名,表3-1列出了这些类型在.NET Framework库中的名称。
一些变量名称前面的“u”是unsigned的缩写,表示不能在这些类型的变量中存储负号,参见该表中的“允许的值”一列。
当然,除了整数以外,还可以存储浮点数,它们不是整数。可以使用的浮点数变量类型有3种:float, double和 decimal。前两种可以用+/–m×2e的形式存储浮点数,m和e的值随着类型的不同而不同。Decimal使用另一种形式:+/–m×10e。这3种类型、其m和e的值,以及它们在实数中的上下限如表3-2所示。
表 3-2
|
类 型 |
别 名 |
m的最小值 |
m的最 大值 |
e的最 |
e的最 |
近似的最小值 |
近似的最大值 |
|
float |
System.Single |
0 |
224 |
–149 |
104 |
1.5 × 10-45 |
3.4 × 1038 |
|
double |
System.Double |
0 |
253 |
–1075 |
970 |
5.0 × 10-324 |
1.7 × 10308 |
|
decimal |
System.Decimal |
0 |
296 |
–26 |
0 |
1.0 × 10-28 |
7.9 × 1028 |
除了数值类型外,还有另外3种简单类型,如表3-3所示。
表 3-3
|
类 型 |
别 名 |
允 许 的 值 |
|
char |
System.Char |
一个Unicode字符,存储0~65535之间的整数 |
|
bool |
System.Boolean |
布尔值:true或false |
|
string |
System.String |
一组字符 |
注意组成string的字符数没有上限,因为它可以使用可变大小的内存。
布尔类型bool是C#中最常用的一种变量类型,类似的类型在其他语言的代码中非常丰富。当编写应用程序的逻辑流程时,一个可以是true或false的变量有非常重要的分支作用。例如,考虑一下有多少问题可以用true或false(或yes和no)来回答。执行变量值之间的比较或检查输入的有效性就是后面使用布尔变量的两个编程示例。
介绍了这些类型后,下面用一个小示例来声明和使用它们。在下面的示例中,要使用一些简单的代码声明两个变量,给它们赋值,再输出这些值。
试试看:使用简单类型的变量
(1) 在目录C:\BegVCSharp\Chapter3下创建一个新的控制台应用程序Ch03Ex01。
(2) 给Program.cs添加如下代码:
static void Main(string[] args)
{
int myInteger;
string myString;
myInteger = 17;
myString = "\"myInteger\" is";
Console.WriteLine("{0} {1}.", myString, myInteger);
Console.ReadKey();
}
|
(3) 运行代码,结果如图3-1所示。
![]() |
| 图 3-1 |
示例的说明
我们添加的代码完成了3项任务:
● 声明两个变量
● 给这两个变量赋值
● 将两个变量的值输出到控制台上
变量声明使用下述代码:
int myInteger;
string myString;
|
第一行声明一个类型为int的变量myInteger,第二行声明一个类型为string的变量myString。
提示:
变量的命名是有限制的,不能使用任意的字符序列。本节的后面将介绍命名变量的规则。
接下来的两行代码给变量赋值:
myInteger = 17;
myString = "\"myInteger\" is";
|
使用=赋值运算符(在本章的“表达式”一节中详细介绍)给变量分配两个固定的值(在代码中称为字面值)。把整数值17赋给myInteger,把字符串"myInteger"(包括引号)赋给myString。以这种方式给字符串赋予字面值时,注意必须用双引号把字符串括起来。因此,如果字符串本身包含双引号,就会出现错误,必须用一些表示这些引号字符的其他字符(即转义序列)来替代它们。在本例中,使用序列\"来转义双引号:
myString = "\"myInteger\" is"; |
如果不使用这些转义序列,而输入如下代码:
myString = ""myInteger" is"; |
就会出现编译错误。
注意给字符串赋予字面值时,必须小心换行 —— C#编译器会拒绝分布在多行上的字符串字面值。如果要添加一个换行符,可以在字符串中使用回车换行符的转义序列,即\n。例如,赋值语句:
myString = "This string has a\nline break."; |
会在控制台视图中显示两行,如下所示:
This string has a line break. |
所有的转义序列都包含一个反斜杠符号,后跟一个字符组合(详见后面的内容),因为反斜杠符号的这种用途,它本身也有一个转义序列,即两个连续的反斜杠\\。
下面继续解释代码,还有一行没有说明:
Console.WriteLine("{0} {1}.", myString, myInteger);
|
它看起来类似于第一个示例中把文本写到控制台上的简单方法,但本例指定了变量。这里不打算详细讨论这行代码。这是本书第一部分用于给控制台窗口输出文本的一种技巧,知道这一点就足够了。在括号中,有两类参数:
● 一个字符串
● 一个用逗号分隔开的变量列表,这些变量的值将插入到输出字符串中。
输出的字符串是"{0} {1}.",它们并没有包含有用的文本。可以看出,这并不是我们运行代码时希望看到的结果,其原因是:字符串实际上是插入变量内容的一个模板,字符串中的每对花括号都是一个占位符,包含列表中每个变量的内容。每个占位符(或格式字符串)用包含在花括号中的一个整数来表示。整数以0开始,每次递增1,占位符的总数应等于列表中指定的变量数,该列表用逗号分隔开,跟在字符串后。把文本输出到控制台时,每个占位符就会用每个变量的值来替代。在上面的示例中,{0}用第一个变量的值myString替换,{1}用myInteger的内容来替换。
在后面的示例中,就使用这种给控制台输出文本的方式显示代码的输出结果。
最后一行代码在前面的示例中也出现过,用于在程序结束前等待用户输入:
Console.ReadKey(); |
这里不详细探讨这行代码,但后面的示例会常常用到它。现在只需要知道,它暂停代码的执行,等待用户按下一个键。
| 回书目 上一节 下一节 |
|
· Linux服务器架设自测获.. · 边界网关安全防护自测.. · Cisco CCNA最新真题自.. · 我在美联储监管银行 书.. · 我在美联储监管银行 目.. · 我在美联储监管银行 前.. |
· 入侵的艺术 目录 · 入侵的艺术 前言 · 网管员全真面试题自测.. · 子弹的本质—— 形势没.. · 学习大量的词汇—— 对.. · 重用的情况怎样 |
|
|||
| · 2008年IT产业29个预言 · Sun以10亿美元并购开源.. · Windows Home Server .. · 2007盘点专题:有多少.. · 病毒查杀专题 · 802.11n:下一代的无线.. · 反垃圾邮件技术应用 · 运营商封堵非法ADSL共享 |
· Windows Server 2008 · VoIP的安全性探讨 · 甲骨文85亿美元收购BEA · 如何优化IT 控制能耗 · 龙芯要做中国的“奔腾” · 手机病毒揭密 · 清除流氓软件——51CTO.. · 华为、贝恩资本22亿美.. |
||
|
|||
| · VPN技术 · SQL Server 2005全解 · SOA 面向服务架构 · 子网掩码教程 · SQL Server 2005全解 · 三层交换技术专题 · Windows远程桌面应用 · 深入了解PGP加密技术 |
· MySQL数据库备份 · 病毒查杀专题 · VPN技术 · Solaris 10 配置管理 · Linux 基础 · Linux防火墙 · SSL VPN详细知识 · 路由器设置与口令恢复 |
||
|
|||
| · VPN技术 · SQL Server 2005全解 · SQL Server 2005全解 · SOA 面向服务架构 · 子网掩码教程 · 三层交换技术专题 · Windows远程桌面应用 · MySQL数据库备份 |
· 身份认证技术 · 病毒查杀专题 · 清除流氓软件——51CTO.. · SSL VPN详细知识 · Sniffer安全技术从入门.. · 常用交换机典型配置 · Linux 集群技术专题 · VPN技术 |
||
| ·DB2 Viper快速入门 ·DB2 9数据库的镜像分割与.. |
·将XML应用程序从DB2 8.x.. ·DB2 9中的pureXML:如何.. |
| ·ASP.NET 2.0 Web Part编.. ·ASP.NET 2.0 Web Part编.. |
·ASP.NET 2.0 Web Part编.. ·ASP.NET 2.0服务器控件之.. |
| ·项目产品化问题 ·网上课程之概念 |
·中国媒体的小娘子气 ·漫话信息沟通 |
| ·在VM6中做Windows Server.. ·让服务器自动启动失败的E.. |
·使用ISA Server保护内部.. ·使用WUCDCreator将SCSI、.. |
| · 思科警告统一通信管理存.. · 家用路由器存在严重缺陷.. · 华为2008市场攻略 240亿.. |
· 浅谈国内的渗透评估过程 · VPN安全技术与应用 · 企业如何进行计算机取证.. |
| · IDC:2008年IT市场10大.. · Visual Studio 2005开发.. · 测试开发人员参考手册 |
· 年初17大热门技术 年底.. · 解析Ajax开发框架 走进A.. · 基于Google Maps与Ajax.. |
| · Linux操作系统下文件和.. · 热点:国内大型企业如此.. · IBM和Sun起争议 坚持不.. |
· 中小企业刀片市场将达20.. · IT人员应当了解的七个存.. · IDC:2008年IT市场10大.. |
| · 甲骨文Oracle 11g正式发.. · Oracle数据库开发之PL/S.. · Oracle数据库开发基础教.. |
· IT人员应当了解的七个存.. · 希捷承认部分硬盘暗藏病.. · 硬盘之父获得诺贝尔物理.. |