单元1我的第一个C#程序C#程序设计案例教程2单元导读本单元将对C#的基础知识进行简要介绍,其中主要包括.
NETFramework、CommonLanguageRuntime以及C#的特点等.
本单元的目的,是让读者快速了解C#的基本概念,对C#有一个基本认识.
在任何一门新技术的学习过程中,最开始的部分都比较困难,所以读者可以不必过分纠结于本单元中的名词,只需有一个简单的了解即可.
学习目标初步认识.
NET,并了解它的组成和特点.
熟悉VisualStudio.
NET开发环境,掌握使用它开发应用程序的步骤.
学习C#程序的基本结构.
掌握如何编辑、编译和运行C#应用程序.
1.
1案例描述.
NET是目前最主流的一门软件开发技术.
自微软2000年推出下一代互联网构想以来,伴随着Microsoft.
NET平台的构建和实施,.
NET以其独有的高效开发特点、简单易行的版本控制等多方面的全新技术优势,迅速风靡北美各大企业,并深受全球开发者的喜爱.
.
NET是世界上最大的软件公司——微软花费300亿美元精心打造的开发平台,可以开发Web程序、Windows应用程序和WAP无线网络应用程序等,其在大型系统开发中的份额越来越重.
本案例中,我们想要初步了解C#和.
NET.
将编写一个应用程序,能根据用户输入的名字,显示"Hello,XXX,欢迎来到C#的世界!
"欢迎词.
执行结果如图1-1所示.
图1-1第一个程序1.
2知识链接1.
2.
1.
NET概述微软对.
NET的定义是:.
NETisarevolutionarynewplatform,builtonopenInternetprotocolsandstandards,withtoolsandservicesthatmeldcomputingandcommunicationsinnew3单元1我的第一个C#程序ways(.
NET拥有以新方式融合计算和通信的工具和服务,它是建立于开放互联网协议标准的革命性的新平台).
.
NET框架(.
NETFramework)是微软公司为了与Sun/Oracle公司的Java(EE)竞争,于2000年6月提出来的一种新的跨语言、跨平台、面向组件的操作系统环境,适用于Web服务(WebServices)和因特网(Internet)分布式应用程序的生成、部署和运行.
.
NET框架也是WindowsVista、Windows7和Windows8等新版Windows操作系统的核心部件.
技术人员要想真正了解什么是.
NET,必须先了解.
NET技术出现的原因和它想解决的问题.
技术人员一般将微软看成一个平台厂商.
微软搭建技术平台,而技术人员在这个技术平台之上创建应用系统.
从这个角度看,.
NET也可以定义为:.
NET是微软的新一代技术平台,为敏捷商务构建互联互通的应用系统,这些系统是基于标准的、联通的、适应变化的、稳定的和高性能的.
从技术的角度看,.
NET应用是一个运行于.
NETFramework之上的应用程序.
1.
2.
2.
NETFramework.
NET平台主要包含的内容有.
NETFramework(.
NET框架)、基于.
NET的编程语言及开发工具VisualStudio等,其体系结构如图1-2所示.
图1-2.
NET的体系结构.
NET平台的基础和核心是.
NETFramework,.
NET平台的各种优秀特性都要依赖它来实现.
.
NETFramework包括两部分内容:一是框架类库(FrameworkClassLibrary,FCL);二是公共语言运行时(CommonLanguageRuntime,CLR),也译作"公共语言运行库".
1.
FCL(框架类库)从图1-2中可以看出,在.
NET平台上可以使用C#、VB.
NET等多种语言来编写程序,不同的语言可以使用相同的FCL.
FCL(FrameworkClassLibrary,框架类库)为开发人员定义并提供了统一的、面向对象的、分层的和可扩展的类库集,其主要部分是BCL(BaseClassLibrary,基类库).
通过创建跨所有编程语言的公共API集,公共语言运行库使得跨语言继承、错误处理和调试成为可能.
从JScript、VisualBasic到VisualC++、C#、F#的所有编程语言(通过托管扩展)具有C#程序设计案例教程4对框架的相似访问,开发人员可以自由选择它们要使用的语言.
相对于贫乏的C++类库和丰富的Java类库,.
NET框架类库非常庞大,包含数百个命名空间、数千个类、接口和值类型.
该库提供对系统功能的访问,是建立.
NET框架应用程序、组件和控件的基础.
框架类库采用命名空间来组织和使用,如.
NET4.
5版的类库提供了588个命名空间,其中用于应用编程的BCL(System型)命名空间有407个.
2.
CLR(公共语言运行时)与Java虚拟机(JavaVirtualMachine,JVM)相似,CLR也是一个运行时环境.
CLR负责内存分配和垃圾回收,也就是通常所说的资源分配,同时保证应用和底层系统的分离.
总而言之,它负责.
NET库所开发的所有应用程序的执行.
CLR所负责的应用程序在执行时是托管的.
托管代码带来的好处是跨语言调用、内存管理、安全性处理等.
CLR隐藏了一些与底层操作系统打交道的环节,使开发人员可以把注意力放在代码所实现的功能上.
非CLR控制的代码即非托管(unmanaged)代码,如C++等,这些语言可以访问操作系统的功能,直接进行硬件操作.
垃圾回收(GarbageCollection)是.
NET中一个很重要的功能,尽管这种思想在其他语言中也有实现.
这个功能保证应用程序不再使用某些内存时,这些内存就会被.
NET回收并释放.
这种功能被实现以前,这些复杂的工作主要由开发人员来实现,而这正是导致程序不稳定的主要因素之一.
一个典型的.
NET程序的运行过程主要包括以下几个步骤.
(1)选择编译器.
为获得公共语言运行库提供的优点,必须使用一个或多个针对运行库的语言编译器.
(2)将代码编译为Microsoft中间语言(MSIL).
编译器将源代码翻译为MSIL并生成所需的元数据.
(3)将MSIL编译为本机代码.
在执行时,实时(JIT)编译器将MSIL(微软中间语言)翻译为本机代码.
在此编译过程中,代码必须通过验证过程,该过程检查MSIL和元数据以查看是否可以将代码确定为类型安全.
(4)运行代码.
公共语言运行库提供使执行能够发生以及可在执行期间使用的各种服务的结构.
1.
2.
3开发环境和C#语言1.
VisualStudio2017VisualStudio是目前最流行的Windows平台应用程序的集成开发环境,最新的版本是VisualStudio2017,其官方发布时给出的"What'snewinVS2017"如图1-3所示,其特点是适用于开发Android、iOS、Windows、Web和云的应用,支持创建.
NETCore程序,可以选择.
NETCore1.
0或.
NETCore1.
1.
本书的所有范例是在VisualStudio2017Professional环境下调试的.
5单元1我的第一个C#程序图1-3VS2017的新特性VS(C#)不同的版本如表1-1所示.
表1-1VisualStudio、.
NETFramework和C#版本名称.
NETFramework版本发布日期C#版本VisualStudio20021.
02002-02-131.
0VisualStudio20031.
12003-04-241.
5VisualStudio20052.
02005-11-072.
0VisualStudio20083.
52007-11-193.
0VisualStudio20104.
02010-04-124.
0VisualStudio20124.
52012-08-255.
0VisualStudio20134.
5、4.
5.
12013-10-175.
0VisualStudio20154.
62015-07-216.
0VisualStudio20174.
72017-03-077.
0说明:C#版本指C#语言规范的版本;VisualC#版本是开发工具的版本,它是VisualStudio的一个组件.
安装VisualStudio2017的过程如下.
(1)从微软网站下载安装文件visual_studio_professional_2017_x86_x64.
exe,只有不到1MB大小.
这只是一个引导程序(WebInstaller),启动之后,将看到安装界面变得更可视化了,总共有三个选项卡.
①"工作负载"选项卡.
工作负载总共分3类,拥有13个具体选项.
Windows类(共3项),如图1-4所示.
图1-4Windows类C#程序设计案例教程6Web和云类(共5项),如图1-5所示.
图1-5Web和云类移动与游戏类(共5项),如图1-6所示.
图1-6移动与游戏类②"单个组件"选项卡.
包含其他工具集(共3项),如图1-7所示.
图1-7其他工具集③"语言包"选项卡.
从中可以选择各种语言,在这里我们选择简体中文.
(2)勾选需要的组件即可进行安装.
为学习本课程以及后继的ASP.
NET和网络编程,可以按如图1-8所示勾选(自定义选择安装路径时,注意所属路径的预留空间要充足,否则安装会失败).
然后进行安装.
7单元1我的第一个C#程序图1-8勾选需要的功能并安装(3)进入下载和安装界面.
安装过程中,VisualStudio2017会占用很多的系统资源,所以最好不要开启太多其他软件,等待安装完成,如图1-9所示.
图1-9正在安装C#程序设计案例教程8(4)等待大概30分钟,就可以完成安装,安装成功后就可以启动VisualStudio2017并开始使用了,如图1-10所示.
(5)第一次打开VisualStudio2017时,需要进行一些基本配置,如开发设置、颜色主题,如图1-11所示.
可以根据自己的需求设置,然后等待几分钟就可以使用.
图1-10安装完成后启动图1-11基本配置由于VisualStudio引入了一种联网IDE体验,所以可以使用微软的账户登录,将会自动采用联网IDE体验的设备同步设置,包括快捷键、VisualStudio外观(主题、字体)等各种类别的同步设置.
2.
C#语言C#是微软公司发布的一种面向对象的、运行于.
NETFramework之上的高级程序设计语言,也是.
NET平台上最重要的语言之一.
C#和.
NETFramework同时出现和发展.
由于C#出现较晚,吸取了许多其他语言的优点,解决了许多问题.
C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程.
但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.
NETWindows网络框架的主角.
C#是一种安全的、稳定的、简单的、优雅的由C和C++衍生出来的面向对象的编程语言.
它在继承C和C++强大功能的同时,去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承).
C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作9单元1我的第一个C#程序能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持等特色成为.
NET开发的首选语言.
C#是面向对象的编程语言.
它使得程序员可以快速地编写各种基于Microsoft.
NET平台的应用程序,Microsoft.
NET提供了一系列的工具和服务来最大程度地开发利用计算与通信领域.
C#使得C++程序员可以高效地开发程序,且因可调用由C/C++编写的本机原生函数,因此绝不损失C/C++原有的强大的功能.
因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快地转向C#.
使用C#,程序员可以创建传统的Windows客户端应用程序、XMLWeb服务、分布式组件、客户端/服务器应用程序、数据库应用程序以及很多其他类型的程序.
1.
2.
4使用VisualStudio创建项目启动VisualStudio2017后,默认出现起始页,如图1-12所示.
图1-12VisualStudio2017的起始页在起始页中,我们可以直接查看最新功能、最新开发人员新闻以及各个DevCenter开发中心,也可以查看新的项目、近期的工作.
如果起始页被关闭,需要再次显示,可以在"视图"菜单中找到"起始页"命令来显示.
程序员可以使用起始页的"开始"→"新建项目"来创建新的项目,或者通过"文件"菜单中"新建"→"项目"命令(见图1-13),调出VisualStudio的"新建项目"对话框,如图1-14所示.
C#程序设计案例教程10图1-13VisualStudio2017创建新项目图1-14"新建项目"对话框VisualStudio的界面会随着所打开文件的类型动态地改变.
图1-15和图1-16分别是创建一个控制台应用程序时的界面和一个窗体程序时的界面.
11单元1我的第一个C#程序图1-15VisualStudio工作界面(控制台应用程序)图1-16查看窗体设计视图时的界面在项目保存位置,以控制台应用程序为例说明我们可以看到相应的文件和文件夹,如图1-17所示.
C#程序设计案例教程12图1-17解决方案文件夹扩展名为.
sln的文件是解决方案文件.
直接双击此文件,会启动VisualStudio并打开该解决方案.
子文件夹ConsoleApp1是项目文件夹,其中存放了该项目的相关项.
在这个文件夹下,扩展名为.
csproj的文件是项目文件,其中记载着关于项目的管理信息.
扩展名为.
cs的文件是C#的源代码文件.
子文件夹bin中存放项目编译后的输出.
子文件夹obj存放编译时产生的中间文件.
而Properties文件夹中存放有关程序集的一些内容,主要是一个AssemblyInfo.
cs文件,里面包含程序版本、信息、版权的属性文件.
1.
2.
5C#程序结构创建好一个控制台程序后,在VisualStudio的资源管理器中双击Program.
cs文件,我们可以看到如图1-18所示的已经生成的程序框架.
我们在Main()方法下面的大括号里可编写自己的代码.
图1-18已经生成的程序框架13单元1我的第一个C#程序1.
2.
6命名空间命名空间是一种组织C#程序中出现的不同类型的方式.
命名空间在概念上与计算机文件系统中的文件夹有些类似.
与文件夹一样,命名空间可使类具有唯一的完全限定名称.
一个C#程序包含一个或多个命名空间,每个命名空间或者由程序员定义,或者作为先前编写的类库的一部分定义.
例如,命名空间System包含Console类,该类包含读取和写入控制台窗口的方法.
System命名空间也包含许多其他命名空间,如System.
IO和System.
Collections.
.
NETFramework本身有八十多个命名空间,每个命名空间有上千个类:命名空间被用来最大程度地减少名称相似的类型和方法引起的混淆.
如果在命名空间声明之外编写一个类,则计算机将为该类提供一个默认命名空间.
若要使用System命名空间包含的Console类中定义的WriteLine方法,可使用如下所示的代码行:System.
Console.
WriteLine("Hello,World!
");记住要在Console类中包含的所有方法之前加System,这一做法很快便会令人觉得很繁琐,因此将using指令插入到C#源文件的开头是个非常有用的快捷方式,如下所示:usingSystem;使用usingSystem;后,就会假定处于System命名空间中,以后就可以这样编写代码:Console.
WriteLine("Hello,World!
");编写大型程序时,经常会用到命名空间.
使用自己的命名空间对名称相似的方法和类型提供了一定程度的控制.
例如:namespaceAdminDeptclassManager{longintsalary;.
.
.
}.
.
.
以上都有Manager这个类的定义,但它们处于不同的命名空间中,当我们要引用这两个类时,应当分别写成AdminDept.
Manager和ITDept.
Manager.
1.
2.
7程序的运行与调试在程序编写过程中,如果有语法错误,会在出错代码下方出现红色波浪线,并在下方的"错误列表"框中会出现提示,如图1-19所示,C#语句是以分号";"结束的,所以在错误列表框中提示"应输入;".
namespaceITDeptclassManager{longintsalary;.
.
.
}.
.
.
C#程序设计案例教程14图1-19错误列表更正后,我们可以运行程序查看结果,运行的方式有两种.
(1)单击VisualStudio工具栏中的"启动"按钮,如图1-20所示.
图1-20启动并运行程序(2)按快捷键F5也可以直接运行程序.
按快捷键F11可以逐语句来执行,方便追踪变量的变化.
更多的调试方法与技巧在后面的单元中会详细讲解.
1.
2.
8了解MSDNMSDN(MicrosoftDeveloperNetwork)Library涵盖了微软全套产品线的技术开发文档和科技文献(部分包括源代码),也包括一些MSDN杂志节选和部分经典书籍的节选章节.
付费后,MSDNLibrary可以通过在线订阅或者以脱机方式浏览.
15单元1我的第一个C#程序MSDN实际上是一个以VisualStudio和Windows平台为核心整合的开发虚拟社区,网址为https://msdn.
microsoft.
com/zh-cn/,包括技术文档、在线电子教程、网络虚拟实验室、微软产品下载(几乎全部的操作系统、服务器程序、应用程序和开发程序的正式版和测试版,还包括各种驱动程序开发包和软件开发包)、Blog、BBS、MSDNWebCast、与CMP合作的MSDN.
HK杂志等一系列服务.
MSDN可以随同VisualStudio一同安装,也可以单独安装.
1.
3案例分析与实现1.
3.
1案例分析针对本单元所给出的案例,分析如下.
(1)首先是显示"请输入您的姓名:",用Console类的WriteLine()方法即可.
(2)控制台要接收用户输入的姓名,使用Console类的ReadLine()方法.
(3)在控制台打印输出"Hello,XXX,欢迎来到C#的世界!
",其中XXX是输入的姓名.
C#中,Console.
WriteLine()函数可以进行格式化输出,形式如下:Console.
WriteLine("格式字符串",变量列表);例如:Console.
WriteLine("我的课程名称是:{0}",course);其中{0}代表占位符,可依次使用{0}、{1}、{2}等,与参数列表中的多个参数对应.
例如:Console.
WriteLine("我叫{0},今年{1}岁了,我的工资是{2}元.
",name,age,salary);1.
3.
2案例实现案例的实现代码如下:usingSystem;usingSystem.
Collections.
Generic;usingSystem.
Linq;usingSystem.
Text;usingSystem.
Threading.
Tasks;namespacedemo01Hello{classProgram{staticvoidMain(string[]args){Console.
WriteLine("请输入您的姓名:");stringname=Console.
ReadLine();C#程序设计案例教程16Console.
WriteLine("Hello,{0},欢迎来到C#的世界!
",name);Console.
ReadKey();}}}说明:结尾的Console.
ReadKey()的作用是等待键盘输入,退出程序.
使调试时能看到输出结果.
如果没有此句,控制台命令窗口会一闪而过.
运行后,就获得了本单元1.
1节中的案例演示效果.
习题一(1)简述C#与.
NET框架的关系.
(2).
NETFramework的主要组件有哪些它们的用途分别是什么(3)可以通过C#开发的应用程序有几种,分别是什么(4)VisualStudio2017开发环境中主要包含哪些窗口(5)简述VisualStudio2017集成开发环境中创建Windows应用程序的主要步骤.
(6)在VisualStudio中,从_窗口可以查看当前项目的类和类型的层次信息.
A.
解决方案资源管理器B.
类视图C.
资源视图D.
属性单元2变量与数据类型C#程序设计案例教程18单元导读在第1单元中,读者接触到了第一个C#应用程序,虽然只是简单地在控制台输出了一句问候语,但它却充分体现了VisualStudio2017的易用性及C#语言的特点.
理解了C#的用途之后,就可以学习如何使用它.
数据类型在数据结构中的定义是一个值的集合以及定义在这个值集上的一组操作.
变量是用来存储值的所在处;它们有名字和数据类型.
变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中.
在声明变量时,也可指定它的数据类型.
所有变量都具有数据类型,以决定能够存储哪种数据.
学习目标理解C#中的数据类型.
理解常量和变量的含义及用法.
理解数据类型转换的含义.
2.
1案例描述在银行系统中,保存了客户的相关信息,并可以对这些信息进行处理,其中包括客户账号、姓名、电话、家庭地址等.
银行的实际客户因为主要的特点不同而被分为不同的类型,包括以支票使用为主的支票客户、以活期储蓄为主的储蓄账户客户等.
我们现在用C#来模拟银行系统中对客户各项详细信息的登记,并打印输入客户的基本信息.
案例的执行效果如图2-1所示.
图2-1银行系统中客户信息的输入与描述2.
2知识链接2.
2.
1数据类型数据就是数值,也就是我们通过观察、实验或计算得出的结果.
数据有很多种,最简单的就是数值.
数据也可以是文字、图像、声音等.
数据可以用于科学研究、设计、查证单元2变量与数据类型19等.
在程序设计中,数据是程序的必要组成部分,是程序处理的对象.
不同的数据有不同的数据类型,不同的数据类型有不同的数据结构和存储方式,并且参与的运算也不同.
C#的数据类型采用了类似于C和C++语言的数据类型表示形式,但又有所改进.
C#将所有的数据类型分为两大类:值类型和引用类型.
值类型直接包含数据.
每个值类型变量都包含有它自己的数据备份,因此对一个值类型变量的操作不会影响其他变量.
引用类型包含指向对象实例的引用或指针.
两个引用类型的变量可以指向同一个对象实例,因此对一个引用变量的操作会影响其他引用变量.
可以通过下面的例子来加深对值类型和引用类型的理解.
假如把计算机的内存看作是一个储物间,里面有很多储物柜.
对于值类型的数据,在内存里分配存储空间时,类似把物品直接存放在储物柜里.
而对于引用类型的数据,则是在储物柜里存放物品存储的地址信息,不直接存储具体的物品,如果要用到该物品,就要先到相应的储物柜里查找物品存放的地址,再到相应地址去取该物品.
数据类型的分类如表2-1所示.
表2-1数据类型的分类值类型引用类型数值类型字符串字符类型数组布尔型类结构接口枚举对象1.
值类型值类型通常用来表示基本类型.
C#的值类型主要包括整数类型、布尔类型、实数类型、字符类型、结构和枚举等.
表2-2列出了预定义的简单值类型.
表2-2预定义的简单值类型名称CTS类型说明范围sbyteSystem.
Sbyte8位有符号整数-27到27-1shortSystem.
Int1616位有符号整数-215到215-1intSystem.
Int3232位有符号整数-231到231-1longSystem.
Int6464位有符号整数-263到263-1byteSystem.
Byte8位无符号整数0到28-1ushortSystem.
Uint1616位无符号整数0到216-1uintSystem.
Uint3232位无符号整数0到232-1C#程序设计案例教程20续表名称CTS类型说明范围ulongSystem.
Uint6464位无符号整数0到264-1floatSystem.
Single32位单精度浮点数±1.
5*10-45到±3.
4*1038(大致)doubleSystem.
Double64位双精度浮点数±5.
0*10-324到±1.
7*10308(大致)decimalSystem.
Decimal128位高精度十进制数±1.
0*10-28到±7.
9*1028(大致)boolSystem.
Booleantrue或false-charSystem.
Char单个Unicode字符-为了避免因为数据类型选择不当造成的程序错误,一定要综合考虑数据的范围及符号,选择合适的数据类型,在保证不出错的前提下做到节约存储空间.
例如,要存储人的年龄,就可以将存储年龄的变量数据类型指定为byte类型.
因为byte型的变量所能表示值的范围在0~255之间.
这个值范围能很好地表示人的年龄,并且所占的内存空间只有1个字节,存储空间最省.
而sbyte类型的数据能存储-128~127的数据,负数对于人的年龄来说,没有实际意义.
如果要让计算机处理带小数的数据,就要用到float数据类型或double数据类型,也叫作浮点类型.
从表2-2中可以看出,浮点类型的数据有更高的精度,但是占用更多的内存空间.
注意:应该注意区分浮点类型和数学中的实数.
数学中的实数是连续的数据,有着严格的计算公式,而浮点数并非如此.
小数类型(decimal)数据是高精度的类型数据,占用16个字节,主要是为了满足需要高精度的财务和金融方面的计算.
小数类型数据的后面必须跟m或者M后缀,来表示它是decimal类型的,如3.
15m,0.
35M等,否则就会被视为标准的浮点类型数据,导致数据类型不匹配.
在C#中,可以通过给数值常数加后缀的方法来指定数值常数的类型,示例如下:137f//代表float类型的数值137.
0137u//代表unit类型的数值137137.
2m//代表decimal类型的数值137.
2137.
22//代表double类型的数值137.
22137//代表int类型的数值137C#中的字符类型数据采用Unicode字符集,类型标识符是char,因此也可称为char类型.
凡是在单引号中的一个字符,就构成一个字符常数,如下所示:'a'、'o'、'*'、'9'在表示一个字符常数时,单引号内的有效字符必须且只能有一个,并且不能是单引号或者反斜杠(\)等.
为了表示单引号和反斜杠等特殊的字符常数,提供了转义符,在需要表示这些特殊常数的地方,可以使用转义符来替代这些特殊的字符.
常用的转义字符如表2-3所示.
单元2变量与数据类型21表2-3常用的转义字符转义字符含义\'单引号\"双引号\\反斜杠\0空\a警告\b退格\f换页\n换行\r回车\t水平制表符\v垂直制表符例如要向控制台输出"I'maChinese",可以编写如下代码:Console.
WriteLine("I\'maChinese");//在输入单引号时用到了\'转义字符为了能表示更多的字符编码,C#用16位的Unicode字符集,可以编码65535个字符.
一些大的符号系统(如中文)中的每个字符都能被编码,常见的ASCII编码则是用一个字节的低7位(高位为0)进行编码,可以表示128个字符.
ASCII编码集是Unicode的一个子集.
布尔类型(bool)是用来表示真和假这两个概念的.
这虽然看起来很简单,但实际应用非常广泛.
布尔类型表示的逻辑变量只有两种取值:"真"和"假".
在C#中,分别采用true和false两个值来表示.
例如:boolb1=true;boolb2=false;C#中的bool类型对应于System.
Boolean结构.
虽然只有两个取值,但它占4个字节.
说明:布尔类型和其他数值之间不存在任何对应关系.
不能认为整数0是false,其他值是true,这是和C以及C++的区别.
故boolx=1是错误的.
当在程序设计中需要定义一些具有整型赋值范围的变量(如星期、月份等)时,可以用枚举类型来定义.
枚举将变量所能赋的值一一列举出来,给出一个具体的范围.
枚举类型用关键字enum来说明,定义如下:enum枚举名{枚举常量1[=整型常数],枚举常量2[=整型常数],.
.
.
C#程序设计案例教程22枚举常量n[=整型常数],};下面是一个定义枚举类型的例子:enumWeekDay{Sun,Mon,Tue,Wed,Thu,Fri,Sat};上面的语句中定义了一个名称为WeekDay的枚举类型,它包含Sun、Mon、Tue、Wed、Thu、Fri、Sat这7个枚举成员.
有了上述定义,WeekDay本身就成了一个类型说明符,此后就可以像常量那样使用这些符号.
注意:两个枚举成员不能完全相同.
在定义的枚举类型中,每一个枚举成员都有一个相对应的常量值,如前面定义的名为WeekDay的枚举类型中,其枚举成员Sun、Mon、Tue、Wed、Thu、Fri和Sat在执行程序时,分别被赋予整数值0、1、2、3、4、5和6.
对于枚举成员对应的常量值,默认情况下,C#规定第1个枚举成员的值取0,它后面的每一个枚举成员的值自动加上1递增.
在编写程序时,也可根据实际需要为枚举成员赋值.
每个枚举成员都有一个与之对应的常量值,在定义枚举类型时,可以让多个枚举成员具有同样的常量值,如下面的代码所示:enumcolor{yellow,brown=2,blue,red=blue,black};yellow对应整数0,brown对应整数2,blue对应整数3,red对应整数3,black对应整数4.
定义了枚举型变量后,可以给枚举型变量赋值,需要注意的是,只能给枚举变量赋枚举常量,或把相应的整数强制为枚举类型再赋值.
如例2-1所示.
例2-1定义一个表示星期的枚举类型,输出枚举变量的值:namespacedemo02_enum{classProgram{enumweek{Sunday=7,Monday=1,Tuesday,Wednesday,Thursday,Friday,Saturday}staticvoidMain(string[]args){weekw;w=week.
Monday;w=(week)2;w=(week)(w+2);Console.
WriteLine("Todayis"+w+".
");单元2变量与数据类型23Console.
ReadKey();}}}运行结果如图2-2所示.
图2-2表示星期的枚举类型利用上面介绍过的简单类型,进行一些常用的数据运算、文字处理似乎已经足够了.
但是会经常遇到一些更为复杂的数据类型.
比如,通信录的记录中可以包含他人的姓名、电话和地址.
如果按照简单类型来管理,每一条记录都要存放到3个不同的变量中,这样工作量很大,也不够直观.
有没有更好的办法呢在实际生活中,经常会把一组相关的信息放在一起.
编程时,把一系列相关的变量组织成为一个单一实体的过程,称为生成结构的过程.
这个单一实体的类型就叫作结构类型.
结构类型的变量采用struct来进行声明.
例如,可以定义通信录记录结构:structPhoneBook{publicstringname;publicstringphone;publicuintage;publicstringaddress;}PhoneBookpl;上面声明的pl就是一个PhoneBook结构类型的变量.
public表示对结构类型的成员的访问权限,有关访问的细节问题,我们将在后续单元中详细讨论.
对结构成员的访问通过结构变量名加上访问符".
",再跟成员的名称来实现.
如以下例子中定义了一个表示学生基本信息的结构类型.
例2-2定义一个表示学生基本信息的结构类型:namespacedemo02_struct{classProgram{structStudent{publicintstuNo;publicintage;publicdoublescore;}C#程序设计案例教程24staticvoidMain(string[]args){Studentmike;mike.
stuNo=168;mike.
age=20;mike.
score=93;Console.
WriteLine("Mike'sinfo:");Console.
WriteLine("No:"+mike.
stuNo);Console.
WriteLine("Age:"+mike.
age);Console.
WriteLine("Score:"+mike.
score);Console.
ReadKey();}}}程序运行结果如图2-3所示.
图2-3用结构类型表示学生信息2.
引用类型引用类型的变量又称为对象,可以存储对实际数据的引用.
C#支持两个引用类型,如表2-4所示.
表2-4预定义的简单引用类型名称CTS类型说明objectSystem.
Object根类型,CTS中的其他类型都是从它派生来的stringSystem.
StringUnicode字符串在C#的统一类型系统中,所有类型(预定义类型、用户定义类型、引用类型和值类型)都是直接或间接从System.
Object继承的.
这是C#的一个重要特性.
string类型表示零或更多Unicode字符组成的序列,它等同于.
NET中的System.
String类,该类提供了很多内置方法,可以轻松地实现对字符串的一些基本操作.
说明:string类型是一个引用类型,该类型数据保存在堆上.
因此,当把一个字符串变量赋值给另一个字符串时,会得到对内存中同一个字符串的两个引用.
例2-3判断字符串是否相等,代码如下:单元2变量与数据类型25namespacedemoIsStringEqual{classProgram{staticvoidMain(string[]args){stringa="hello";//声明string类型变量astringb=a;//将a赋予b,实际上是将a的引用地址赋给bstringc="h";//声明string类型变量cc+="ello";//比较两个引用是否相等Console.
WriteLine((object)a==(object)b);Console.
WriteLine((object)a==(object)c);//比较a、c两个对象的值是否相等Console.
WriteLine(a==c);Console.
ReadKey();}}}本例判断字符串是否相等,声明了三个string类型的变量.
先将变量a初始化为字符串"hello",再将a赋值给b,这时,实际上是把变量a的引用赋给了b,也就是说,赋值完成后,a和b是指向同一个地址的.
然后声明string类型变量c,虽然它的字面量也是"hello",不过,它和a、b不是指向同一地址.
程序运行结果如图2-4所示.
图2-4程序运行结果从输出结果可以看出,变量a和b是指向同一个地址的,c则不同,它是重新声明的一个字符串变量,有自己的地址,这个地址不同于a里存储的地址信息.
说明:尽管string是引用类型,但定义相等运算符(==)是为了比较string对象(而不是引用)的值.
这使得对字符串相等性的测试更为直观.
2.
2.
2变量与常量1.
常量常量是指那些基于可读格式的固定数值,在程序的运行过程中其值是不可改变的.
通过关键字const来声明常量,其格式如下:const类型标识符常量名=表达式;C#程序设计案例教程26例如:constdoublePI=3.
14159265;上面的语句就定义了一个double类型的常量PI,它的值是3.
14159265.
定义常量时,表达式中的运算符对象只允许出现常量,不能有变量存在.
例如:inta=20;constintb=30;constintc=b+25;//正确,因为b是常量constintk=a+45;//错误,表达式中不允许出现变量c=150;//错误,不能修改常量的值2.
变量C#是一种"强类型"编程语言,在声明变量时必须指明它的数据类型.
声明变量的作用之一是告诉编译器要为变量分配多少内存空间.
就像要将一个物品存进储物间,应该事先让保管员知道,这个物品有多大,以便分配合适大小的储物柜.
大了会浪费空间,小了东西放不下,会造成不必要的错误.
变量是存储数据的一个基本单元,主要有变量名、变量类型和变量值三方面的含义,可以用如图2-5所示的对应例子来帮助理解.
变量就像房间一样,通过内存中小房间的别名找到数据存储的位置.
图2-5变量的含义声明变量的格式如下:数据类型变量名;比如,下面的代码声明一个int型的变量i:inti;变量声明后,可在程序运行中给变量赋值,或者可以在声明的时候给变量赋初值.
一个变量声明以后可以多次赋值.
在初始化时对变量赋值采用下面的格式:数据类型变量名=初始值;例如:doubletotal=34.
3D;注意:给double数据类型赋值的时候,可以在数值后面加d或D表示,而float类型用f或F表示,decimal类型用m或M表示.
单元2变量与数据类型27如果在一个语句中声明和初始化了多个变量,那么所有的变量都具有相同的数据类型,例如:intx=10,y=20;//x和y都有相同的数据类型int,但是它们的值不同给bool数据类型赋值要用true或false,例如:boolvalidateInput=true;变量的初始化是C#强调安全性的另一个方面.
C#编译器需要用某个初始值对变量进行初始化,之后才能在操作中引用该变量.
如下面的一段语句,声明了两个变量i和j,并将i初始化成12,再将i和j相加,把结果存入i中:inti,j;//定义变量i=12;//给变量赋值i=i+j;在编译时,会有错误提示:使用了未赋值的局部变量"j",要消除这种错误,只需要给j一个明确的赋值就可以了,比如将j赋值成10.
3.
变量的命名规范及编码规则在C#中,对变量的命名有一些限制,包括以下规则:变量名必须以字母或下划线开头.
变量只能有字母、数字、下划线,不能包含空格、标点等,且不能由数字开头.
变量名不得与C#中的关键字同名.
变量名不得与C#中的库函数同名.
下面给出了一些合法和不合法的变量名:string3str;//不合法,以数字开头floattotalcount;//不合法,变量名包含空格intprod2;//合法doubleMain;//不合法,与Main函数同名doublefloat;//不合法,float是关键字,不能用作变量名关键字也被称为保留字,是C#中有特殊用途的一些英文单词,不能再用做标识符.
根据关键字的不同,其用途也不同,这其中既有用于声明变量的类型别名(如int、float),也有用于表示特定语句的关键字(如if、while等).
本书的后续部分将逐渐学习到大部分关键字的用法.
C#中的标识符不能与关键字相同,但是可以使用"@"前缀来避免这种冲突.
例如:@whilewhile上面两个标识符中,第一个标识符是合法的,而第二个标识符不是合法的,因为while是关键词.
变量名除了合法性之外,还要考虑变量名的清晰性.
对变量的命名最好能做到见名知意.
一个好的变量名,能让人很快地知道这个变量的作用.
比如,用来表示售货员的标识C#程序设计案例教程28符使用salesman比用people更容易理解.
多数变量命名采用Camel命名方法,即首字母小写后,其后续每个单词的首字母均大写.
例如,下面的变量名就是用Camel命名方法来命名的:stringstuName;floattotalCount;intproductId;说明:对于变量、类名、方法名等都有不同的命名约定,包括骆驼(Camel)命名法、帕斯卡(Pascal)命名法等.
2.
2.
3数据类型间的转换不同的数据有不同的数据类型,那么,不同类型之间可以转换吗答案是肯定的.
所有值类型和引用类型都由一个名为object的基本类发展而来.
在C#中还可以通过隐式转换(不会造成数据丢失)或显式转换(可能造成数据丢失或降低精确度)来改变数据类型.
1.
装箱和拆箱任何值类型、引用类型可以和object类型之间进行转换.
装箱是值类型到object类型或到此值类型所实现的任何接口类型的隐式转换,拆箱是从object类型到值类型或从接口类型到实现该接口的值类型的显式转换.
简言之,装箱就是将值类型转换为引用类型;反之就是拆箱.
例2-4简单的装箱操作如下:namespacedemo02_BoxingExample{classProgram{staticvoidMain(string[]args){inti=10;objectobj=i;//隐式装箱objectobj2=(object)i;//显式装箱if(objisint)//is运算符检查对象是否与特定的类型兼容{Console.
WriteLine("OK");}Console.
WriteLine(obj.
GetType());//返回当前对象的类型Console.
ReadKey();}}}运行效果如图2-6所示.
说明:要判断对象是否与某个给定的类型兼容,用is运算符;如果要返回一个类型的字符串,可以用object类的GetType()方法.
单元2变量与数据类型29图2-6装箱操作拆箱是装箱的逆过程.
一般拆箱过程分成两步:首先,检查这个对象实例,看它是否为给定的值类型的装箱值;然后,把这个实例的值复制给值类型的变量.
比如:inti=10;objectobj=i;//隐式装箱intj=(int)obj;//拆箱注意:在拆箱时,必须非常小心,要确保得到的值变量有足够的空间存储拆箱值中的所有字节.
在实现拆箱的时候,如果待拆的对象无法转换为给定的值类型,则会引发异常.
比如下面的代码,long类型无法转换为int类型,就会发生异常:longi=1234567;objectj=(object)i;//装箱intk=(int)j;//在拆箱时会发生异常2.
隐式转换隐式转换是系统默认的,不需要加以声明就可以进行转换.
在隐式转换过程中,编译器不需要对转换进行详细的检查就能安全地执行转换,例如数据从int类型到long类型的转换.
比如从int类型转换到long类型就是一种隐式转换.
隐式转换一般不会失败,转换过程中也不会导致信息丢失.
方法如下所示:inta=10;//a为整型数据longb=a;//b为长整型数据doublec=a;//c为双精度浮点型数据3.
显式转换显式转换又称为强制类型转换,与隐式转换相反,显式转换需要用户明确地指定转换类型.
显式转换可以将一数值类型强制转换成另一种数据类型,其格式如下:(类型标识符)表达式上式的含义为:将表达式值的类型转换为类型标识符的类型.
比如:(int)5.
17//把double类型的5.
17转换成int类型如果需要在数字和字符串之间转换,不能使用上面强制转换表达式,而需要使用.
NET架构提供的ToString和Parse方法.
C#程序设计案例教程30整型、浮点型、字符型和布尔类型都对应地有一个结构类型,该结构类型中提供Parse方法,可以把string类型转换成相应的类型.
例如,要把string类型转换成int类型,则有相应的int.
Parse(string)方法,如:stringstr="123";inti=int.
Parse(str);则i的值为123.
注意:如果不能将指定的字符串转换成数值类型,如要把字符串"你好"转换成整数,Parse方法会自动抛出异常.
计算后的数据如果要以文本的方式输出,如在文本框中显示计算后的数据,则需要将数值数据转换成string类型,转换方法是执行ToString方法.
例如:intj=5*8;stringstr="5*8的积是:"+j.
ToString();除了使用相应类的Parse()方法之外,还可以使用System.
Convert类的对应方法将数字转换为相应的值.
例如上述例子也可以写成:stringstr="123";inti=Convert.
ToInt32(str);intj=5*8;stringstr="5*8的积是:"+Convert.
ToString(j);Convert类的静态方法用于支持.
NETFramework中与基数据类型之间的转换.
更多方法可以通过IDE查看Convert类的成员.
2.
2.
4DateTimeDateTime是用来表示时间和处理时间的类型,属于结构类型.
下面通过示例来看它的基本用法.
例2-5用户输入一个日期,要求输出这个日期是星期几和在这一年中的第几天:namespacedemo02_DateTime{classProgram{staticvoidMain(string[]args){//声明一个DateTime类型的变量,用于存放用户输入的日期DateTimedt;Console.
WriteLine("请输入日期:(例如:2000-01-01或2000/01/01)");//把输入的日期字符串转换成日期格式类型dt=DateTime.
Parse(Console.
ReadLine());//因为DayOfWeek返回的是0、1、2、3、4、5、6,//分别对应的是日、一、二、三、四、五、六单元2变量与数据类型31//Substring是检索字符串并返回匹配的指定长度的子字符串stringstr="日一二三四五六".
Substring((int)dt.
DayOfWeek,1);Console.
WriteLine("{0}年{1}月{2}日是星期{3}",dt.
Year,dt.
Month,dt.
Day,str);Console.
WriteLine("{0}年{1}月{2}日是这一年的第{3}天",dt.
Year,dt.
Month,dt.
Day,dt.
DayOfYear);Console.
WriteLine("{0}是星期{1}",dt.
ToShortDateString(),str);Console.
WriteLine("{0}是这一年的第{1}天",dt.
ToLongDateString(),dt.
DayOfYear);Console.
ReadKey();}}}运行结果如图2-7所示.
图2-7利用DateTime来计算天数例2-6显示当前日期和时间的不同格式(运行结果见图2-8):namespacedemo02_DateTime{classProgram{staticvoidMain(string[]args){//以不同的格式显示当前日期和时间Console.
WriteLine("现在时间是:{0}",DateTime.
Now.
ToString("yyyy-M-dH:m:s"));Console.
WriteLine("现在时间是:{0}",DateTime.
Now.
ToString("yyyy-MM-ddHH:mm:ss"));Console.
WriteLine("现在时间是:{0}",DateTime.
Now.
ToString("yyyy-MM-dd"));Console.
WriteLine("短日期字符串表示现在时间是:{0}",DateTime.
Now.
Date.
ToShortDateString());Console.
WriteLine("长日期字符串表示现在时间是:{0}",DateTime.
Now.
Date.
ToLongDateString());Console.
ReadKey();}}}C#程序设计案例教程32图2-8当前日期和时间的不同格式2.
3案例分析与实现2.
3.
1案例分析针对本单元所给出的案例,分析如下.
(1)因为需要处理至少两种客户类型,所以定义一个CUSTOMERCATEGORY枚举类型,用于表示客户的账号类型.
在其中列举两个枚举常量:SAVINGACCOUNT和CHECKINGACCOUNT,分别表示储蓄账户客户和支票账户客户.
(2)定义结构体类型Customer,用于表示客户的账户信息,包含结构体成员变量.
(3)定义表示当前可用客户账号的变量、表示客户账号的变量、表示客户姓名的变量、表示客户地址的变量、表示客户电话号码的变量、表示客户账号余额的变量.
为它们确定合理的数据类型.
(4)当创建一个新的客户账号时,则定义一个结构体Customer的变量,由控制台输入当前客户的各项信息,按需求执行数据类型的转换和数据处理,并将输入的客户信息打印输出.
2.
3.
2案例实现案例的实现代码如下:namespacedemo02_DataType{classProgram{//////客户账号类型,枚举类型///enumCUSTOMERCATEGORY{//////储蓄账户客户///SAVINGACCOUNT=1,//////支票账户客户///单元2变量与数据类型33CHECKINGACCOUNT}//////客户账户信息,结构体类型///structCustomer{//////当前可用客户账号,最小为500000///staticpublicintcurrentAccountNumber=500000;//////客户账号///publicintaccountNumber;//////客户账户类型///publicCUSTOMERCATEGORYaccountCategory;//////客户姓名///publicstringname;//////地址///publicstringaddress;//////电话号码///publicintphone;//////账号余额///publicdoublebalance;}staticvoidMain(string[]args){CustomercurrentCustomer;currentCustomer.
accountNumber=Customer.
currentAccountNumber+1;Console.
WriteLine("请输入当前客户的详细信息:");Console.
Write(C#程序设计案例教程34"请选择客户的账户类型(1、储蓄账户客户;2、支票账户客户):");currentCustomer.
accountCategory=(CUSTOMERCATEGORY)Convert.
ToInt32(Console.
ReadLine());Console.
Write("请输入客户姓名(最多30个字符,最少2个字符):");currentCustomer.
name=Console.
ReadLine();Console.
Write("请输入客户地址(最多80个字符,最少2个字符):");currentCustomer.
address=Console.
ReadLine();Console.
Write("请输入客户电话号码(40000000-99999999):");currentCustomer.
phone=Convert.
ToInt32(Console.
ReadLine());Console.
Write("请输入客户账户余额(大于0的数):");currentCustomer.
balance=Convert.
ToDouble(Console.
ReadLine());Console.
WriteLine("\n当前客户的详细信息显示如下:");Console.
WriteLine("客户账号:"+currentCustomer.
accountNumber);Console.
WriteLine("账户类型:"+currentCustomer.
accountCategory);Console.
WriteLine("客户姓名:"+currentCustomer.
name);Console.
WriteLine("客户地址:"+currentCustomer.
address);Console.
WriteLine("客户电话号码:"+currentCustomer.
phone);Console.
WriteLine("客户账户余额:"+currentCustomer.
balance);Console.
ReadKey();}}}运行后,即可见本单元2.
1节中的演示效果.
2.
4拓展训练2.
4.
1拓展实训1:使用变量存储一部手机的信息请按照下面给出的手机信息,存储并打印输出.
(1)品牌(brand):苹果6SPlus.
(2)重量(weight):192g.
(3)后置摄像头像素(camera):120,000,000px.
(4)价格(price):6288.
分析:编程时,请注意各变量数据类型的选取,数值类型需要考虑数值范围.
由于实训题比较简单,具体实现由读者完成.
2.
4.
2拓展实训2:数字加密器请实现一个数字加密器,要求如下:加密的结果=(需加密的整数*3+8)/2+3.
14,加密的结果要求仍然为整数,取计算后结果的整数部分.
分析:需要进行数据类型的转换,考虑应该用隐式转换还是强制转换.
由于实训题比较简单,具体实现由读者完成.
单元2变量与数据类型35习题二(1)C#变量合法命名的是().
A.
$abccB.
12_223C.
myStringD.
.
123aab(2)C#变量采用的命名法是().
A.
PascalB.
CamelC.
变量命名法D.
其他命名法(3)能代表C#自定义命名空间的关键字是().
A.
classB.
publicC.
usingD.
namespace(4)C#引用系统命名空间如System.
Text,是使用哪一个关键字()A.
classB.
publicC.
usingD.
namespace(5)C#中转义符用于换行的是().
A.
\tB.
\rC.
/tD.
/r(6)C#中每个int类型的变量占用()个字节的内存A.
1B.
2C.
4D.
8(7)在C#中,表示一个字符串的变量应使用以下哪条语句定义()A.
CStringstr;B.
stringstr;C.
DimstrasstringD.
char*str;(8)在C#编制的财务程序中,需要创建一个存储流动资金金额的临时变量,则应使用下列哪条语句()A.
decimaltheMoney;B.
inttheMoney;C.
stringtheMoney;D.
DimtheMoneyasdouble(9)C#中,新建一个字符串变量str,并将字符串"Tom'sLivingRoom"保存到串中,则应该使用下列哪条语句()A.
stringstr="Tom\'sLivingRoom";B.
stringstr="Tom'sLivingRoom";C.
stringstr("Tom'sLivingRoom");D.
stringstr("Tom"sLivingRoom");(10)将变量从字符串类型转换为数值类型可以使用的类型转换方法是().
A.
Str()B.
CcharC.
CStr()D.
int.
Parse();(11)数据类型转换的类是().
A.
ModB.
ConvertC.
ConstD.
Single
在之前几个月中也有陆续提到两次HostYun主机商,这个商家前身是我们可能有些网友熟悉的主机分享团队的,后来改名称的。目前这个品牌主营低价便宜VPS主机,这次有可以看到推出廉价版本的美国CN2 GIA VPS主机,月费地址15元,适合有需要入门级且需要便宜的用户。第一、廉价版美国CN2 GIA VPS主机方案我们可看到这个类型的VPS目前三网都走CN2 GIA网络,而且是原生IP。根据信息可能后续...
CloudCone 商家产品还是比较有特点的,支持随时的删除机器按时间计费模式,类似什么熟悉的Vultr、Linode、DO等服务商,但是也有不足之处就在于机房太少。商家的活动也是经常有的,比如这次中国春节期间商家也是有提供活动,比如有限定指定时间段之前注册的用户可以享受年付优惠VPS主机,比如年付13.5美元。1、CloudCone新年礼物限定款仅限2019年注册优惠购买,活动开始时间:1月31...
Hostinger 商家我们可能一些新用户不是太熟悉,因为我们很多新人用户都可能较多的直接从云服务器、独立服务器起步的。而Hostinger商家已经有将近十年的历史的商家,曾经主做低价虚拟主机,也是比较有知名度的,那时候也有接触过,不过一直没有过多的使用。这不这么多年过去,Hostinger商家一直比较稳妥的在运营,最近看到这个商家在改版UI后且产品上也在活动策划比较多。目前Hostinger在进...
转义字符为你推荐
设置xpcontributionsgraph计划ipad支持ipad特斯拉苹果5勒索病毒win7补丁求问win7 64位旗舰版怎么预防勒索病毒iphone连不上wifi苹果手机“无法加入网络”怎么办tcpip上的netbiostcp 协议里的 netbios . 在哪,找不到win7如何关闭445端口如何判断445端口是否关闭googleadsensegoogle adsense 和google adwords有什么区别?适合什么样的人群?
出租服务器 新秒杀 高防dns 好看的留言 轻博 天猫双十一抢红包 英文站群 阿里云浏览器 免费活动 vip购优惠 登陆空间 ledlamp 中国联通宽带测试 腾讯网盘 免费赚q币 贵州电信 fatcow asp介绍 wannacry勒索病毒 德国代理ip 更多