版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、PAGE PAGE 1-41 C#程序设计简介本章介绍C#语言的特点、开发C#程序的基本步骤、C#程序的构成、基本输入输出以及C#的开发工具等。通过本章的学习,可以对C#程序设计有一个初步的认识。1.1 C#语言及其环境C#(发音为“C Sharp”)是由Microsoft开发的面向对象的编程语言。它继承了C和C+、Java等语言的优点并且有了较大的发展,是迄今为止最为优秀、最为通用的程序设计语言之一。1.1.1 C#的产生与发展C#是直接从世界上最成功的计算机语言C和C+继承而来,又与Java紧密相关。理解C#的产生与发展有助于C#的学习。1结构化编程与C语言C语言的产生标志着现代编程时代的
2、开始。C语言是20世纪70年代由Dennis Ritchie在基于UNIX操作系统上创建的。在一定意义上,20世纪60年代的结构化编程造就了C语言。在结构化编程语言产生之前,大型的程序是很难编写的。因为往往在编写大型程序的时候,会由于存在大量的跳转、调用和返回很难进行跟踪调试。结构化的编程语言加入了优化定义的控制语句,子程序中采用了局部变量和其他的改进,使得这种问题得到了解决。C语言是结构化编程语言中最为成功的一种,至今C语言仍用常用的语言之一。2面向对象编程与C+语言C语言还是有它自身的局限性。到了20世纪70年代末期,很多项目的代码长度都接近或者到达了结构化编程方法和C语言能够处理的极限。
3、为了解决这个问题,出现了新的编程方法,即面向对象编程(简称OOP),程序员使用OOP可以编写出更大型的程序。1979年初,Bjarne Stroustrup在贝尔实验室创造了C+。C+是C的面向对象的版本。对于C程序员,可以方便地过渡到C+,从而进行面向对象的编程。20世纪90年代中期,C+成为广泛使用的编程语言。3网络的发展与Java语言随着网络的发展,编程语言进入到的下一个主流就是Java。Java的创造工作由1991年在Sun公司开始,其主要发明者是James Gosling。Java是一种面向对象的语言,它的语法和思想起源于C+。Java最重要的一方面是具有编写跨平台、可移植代码的能力
4、,Java能够将一个程序的源代码转换到被称为字节码的中间语言,实现了程序的可移植性。该字节码在Java虚拟机上被执行。因此,Java程序可移植到有Java虚拟机的任何环境中。由于Java虚拟机相对比较容易实现,所以适用于大部分的环境。在Java中采用中间语言是很重要的,在其后的C#中采用了类似的方案。4C#语言的产生Microsoft公司在20世纪90年代末开发了C#,其首席设计师是Anders Heilsberg。 REF _Ref41109692 h 图 11展示了C#的家族史。C#的祖父是C,C#继承了C的语法、关键词和运算符。C#建立在C+定义的对象模型基础上,并加以改进。图 STYL
5、EREF 1 s 1 SEQ 图 * ARABIC s 1 1 C#的产生历史C#起源于C和C+,并且与Java有许多相似之处,同时C#包含了许多创新的特性,这些特性将会在本书中进行详细的讲解。5C#语言的发展C#语言从2002年正式发布以来,经历了多个版本,主要的版本如 REF _Ref41795680 h 表 11所示。C#的发展是与C#的运行环境(Microsoft.NET)以及集成开发工具(Visual Studio)同步发展的。表 STYLEREF 1 s 1 SEQ 表 * ARABIC s 1 1 C#语言的各个版本年月C#版本.NET版本Visual Studio版本2002-
6、11.01.0.3705.0Visual Studio.NET 20022003-41.1, 322.573Visual Studio.NET 20032005-112.02.0.50727.42Visual Studio 20052006-113.03.0.4506.30Visual Studio 20052007-113.03.5.21022.8Visual Studio 20082010-44.04.0.330319Visual Studio 20102012-95.04.5Visual Studio 20122013-115.04.5.1Visual Studio 20
7、132014-116.04.6Visual Studio 20152017-37.04.7Visual Studio 2017C#语言仍在迅速发展之中,除了主要用在Windows平台,现在还可以用于Linux、Mac OS平台。对于学习者而言,C#可以很快被C和C+、Java程序员所熟悉,而且C#避免了其他语言中一些容易出错、难于使用的成份,并且利用集成开发环境Visual Studio可以大大提高程序开发的效率。可见,学习C#语言不仅必要,而且是可以学得好的。1.1.2 C#的环境Microsoft.NET尽管C#是一种可以单独学习的计算机编程语言,但是它与其运行期环境Microsoft.N
8、ET框架仍然有密切联系。究其原因有二:其一,微软最初设计C#语言是为了编写.NET框架;其二,C#使用的函数库是.NET框架定义的函数库中的一部分。因此,虽然可以把C#与.NET环境分开,但是它们实际上是密切联系的。由于以上原因,对.NET框架有一个基本了解是非常必要的。事实上,本书不仅介绍C#语言本身,还介绍C#语言在.NET环境中的应用。1什么是Microsoft.NET Microsoft.NET是一个综合性的术语,它描述了微软公司最近才发布的许多技术。总的说来,Microsoft.NET包括以下技术领域:.NET框架(.NET Framework).NET语言,包括C#, F#, C+
9、, Visual Basic等开发工具,主要是Visual Studio开发工具Visual Stduio操作系统(Windows及其他)WebFormADO.NET。XMLWinFormmWPFLINQWFWCFC#F#C+VB公共语言规范(CLS)公共语言运行环境(CLR).NET framework 基础类库(BCL)应用程序这几个部分之间的关系,如 REF _Ref485478146 h 图 12所示。图 STYLEREF 1 s 1 SEQ 图 * ARABIC s 1 2 Microsoft.NET体系其中.NET框架位于操作系统之上,它定义了一种支持开发和执行应用程序的环境。.N
10、ET框架定义了包含了两个重要的部分。一个是公共语言运行环境(Common Language Runtime,CLR),它管理程序的执行。另一个是.NET类库,使得我们在进行C#编程时可以调用这些库。2公共语言运行环境公共语言运行环境(CLR)管理.NET代码的执行,可以认为它是一个执行C#程序的虚拟运行环境(虚拟机)。CLR负责为应用程序提供内存分配、线程管理、安全以及垃圾回收等服务,负责对了代码进行严格的类型安全检查,以保证代码安全、正确地运行。C#源程序首先编译成中间代码,在执行时,再即时转换成机器指令。如图1-2所示。JIT编译在内存中机器指令可执行程序(.exe)含有MSIL及元数据C
11、#源程序(.cs文件)图 STYLEREF 1 s 1 SEQ 图 * ARABIC s 1 3 C#程序的编译与执行过程当编译C#程序时,编译器并不输出CPU指令,而是一种特殊的中间代码。这些中间代码被称为通用中间语言(Common Intermediate Language,简称CIL)(又称为Microsoft Intermediate Language,简称MSIL或IL)。CIL定义了一系列与CPU类型无关的可移植指令集,可以认为是一种可移植的汇编语言。当程序运行时,CLR负责把中间代码转换成可执行代码。从这个角度说,任何被编译成MSIL的程序都能运行在实现了CLR的环境下。这就是为
12、什么.NET框架具有可移植性的原因。这个转换过程一般是使用JIT编译器,JIT代表“Just In Time”,意思是“即时地”。当.NET程序运行时,CLR激活JIT编译器,JIT编译器把MSIL转换成机器指令(本地代码)。除了CIL指令,当编译C#程序时输出的另一部分是元数据(Metadata)。元数据用来描述在程序本身的信息,特别是程序的类型信息,它与IL保存于同一个文件中。在CLR定位与装载类型时,系统通过读取并解析元数据来获得应用程序中的类型信息,由于整个过程中CLR始终根据元数据建立并管理对应特定应用程序的类型,从而保证了类型安全性。般来说,当编写一个C#程序时,创建的程序被称为托
13、管代码(managed code)或受控代码。由于托管代码是在CLR的控制下执行,因此受到一些限制,当然也获得一些好处。受到的限制有:编译器必须产生面向CLR的CIL文件,必须使用.NET框架库函数(如同C#那这部分的CIL缩略语是否可以统一?样)。受控代码的好处有:混合语言编程的能力、更好的安全性、支持版本控制等等。与托管代码相对应的是非托管代码(unmanaged code),非托管代码的执行不受CLR的控制。在.NET框架以前的所有Windows程序都是非托管控代码。因为托管代码和非托管代码是可以共同运行的,所以事实上C#程序可以与以前的程序并存(在本书的最后一章介绍了这样的例子)。总之
14、,CLR管理受控代码的执行,它分两步来进行,并且保证程序的安全性。3.NET类库.NET框架的另一个重要部分是.NET类库。这些类库提供了包括基础类库、输入输出、图形用户界面、网络功能、数据库访问等多方面的功能。C#编程时可以使用这些库。其中基础类库又称为BCL(basic class library),它封装了大量的基础功能,如文件操作、图形操作、网络连接、XML文档、安全加密等。我们在编程时可以调用这些功能,而不用所有的程序都从最底层开始编写。本书中会对这些功能进行介绍。在BCL之上,又有大量的类库,具有更复杂的功能。如Windows Form表示Windows窗体,Web Form表示网
15、页表单,ADO.NET表示数据库访问功能,在新版本的.NET Framework更增加了诸如:WPF(Windows Presentation Foundation)是基于Windows 的用户界面框架;WCF(Windows Communication Foundation)是通讯方面的类库;WF(Workflow Fundation)是工作流框架,Linq是基于语言的查询等等。这使得应用程序编写起来更方便。4公共语言规范及.NET语言.NET可以使用C#语言来编程,也可以使用F#、C+、Visual Basic等多种语言来进行编程,它们都可以编写托管代码,并生成CIL中间指令,所有各种语言
16、编写的程序可以互相调用,也就是说.NET能进行跨语言集成。如果要托管代码能将被用其他语言所编写的程序使用,它必须遵守公共语言规范(Common Language Specification,CLS)。CLS描述了不同的编程语言都应具有的特征集,比如程序中使用一些通用的数据类型,而不使用一些特定的数据类型。当编写要被其他语言调用的程序组件时,遵循CLS显得尤其重要。5开发工具Visual Studio是.NET的集成开发工具,它具有编辑、编译、调试程序与项目管理的功能。还有一些相关的工具,如反汇编、证书管理、注册工具、XML工具等等。正是由于有了它们的支持,.NET才变得如此强大。在我们的学习过
17、程中,可以使用一些命令行的工具,但主要还是使用Visual Studio,它功能强大,而且使用方便。微软提供了免费的及专业的Visual Studio版本,可以在网站上下载。6关于跨平台的框架早期.NET框架主要用于Windows平台,但是现在.NET并不局限于Windows平台,借助于Mono或.NET core,C#也可以用于Linux及Mac OSX平台。其中mono是第三方提供的框架,而.NET core则是微软提供的开源、免费的框架。.NET Core 是.NET Framework的新一代版本,它具有跨平台 (Windows、Mac OSX、Linux) 能力。与.NET Fram
18、ework相似,它提供了编译、运行的环境(如Core CLR),也提供了基本的类库(如Core FX),微软还提供了开发工具(如Visual Studio Code)。由于.NET core的基本类库与.NET Framework的基本类库具有高类的相似性,可以开发人员很容易在两种框架间相互转换,从而开发出跨平台的应用程序。值得一提的是,微软还提供了Xamarin等开发工具,可以使用C#开发来开发移动应用程序,包括iOS、Android、Windows Phone和Mac App。简单地说,.NET core是.NET Framework跨平台的版本,Xamarin是手机开发用的环境,它们与.
19、NET Framework的运行环境不同,但所用的语言、所用的库则有很多相似性,本书以.NET Framework为主进行讲解。1.1.3 C#的特点C#代表着编程语言演变的一个新阶段,它继承了C+和Java这两种世界上最重要的语言的优点,并且还增加了委托、事件、索引器、Lambda表达式、并行编程等创新性特点;同时,C#语言利用了.NET作为其强大的平台,使得它在Windows图形用户界面、ASP.NET Web应用及ADO.NET数据库等方面有广泛的应用。下面从学习和使用的角度来介绍C#的特点。当读者学完本书后会对C#语言的这些特点有更深的理解。1简单易学衍生自C+的C#语言,除去了C+中
20、不容易理解和掌握的部分,如最典型的指针操作、ALT、#define宏等,降低了学习的难度;同时C#还有一个特点就是它的基本语法部分与C+、Java语言几乎一模一样。这样,无论是学过C#再学C+、Java,还是已经掌握了C+、Java语言再来学C#,都会感到易于入门。2面向对象C#是面向对象的编程语言。面向对象技术较好地适应了当今软件开发过程中新出现的问题,包括软件开发的规模扩大、升级加快、维护量增大以及开发分工日趋细化、专业化和标准化等,是一种迅速成熟、推广的软件开发方法。面向对象技术的核心是以更接近于人类思维的方式建立计算机逻辑模型,它利用类和对象的机制将数据与其上的操作封装在一起,并通过统
21、一的接口与外界交互,使反映现实世界实体的各个类在程序中能够独立、自治、继承;这种方法非常有利于提高程序的可维护性和可重用性,大大提高了开发效率和程序的可管理性,使得面向过程语言难于操纵的大规模软件可以很方便的创建、使用和维护。C#具有面向对象的语言所应有的一切特性如封装、继承与多态。在C#的类型系统中每种类型都可以看作一个对象,甚至对基本类型,C#提供了一个叫做装箱(boxing)机制,使其成为对象。3安全稳定对网络上应用程序的另一个需求是较高的安全可靠性。用户通过网络获取并在本地运行的应用程序必须是可信赖的,不会充当病毒或其他恶意操作的传播者而攻击用户本地的资源;同时它还应该是稳定的,轻易不
22、会产生死机等错误,使得用户乐于使用。C#特有的机制是其安全性的保障,同时它去除了C+中易造成错误的指针,增加了自动内存管理等措施,保证了C#程序运行的可靠性。内存管理中的垃圾收集机制减轻了开发人员对内存管理的负担,.NET平台提供的垃圾收集器(Garbage Collection,GC)将负责资源的释放与对象撤销时的内存清理工作。同时,变量的初始化、类型检查、边界检查、溢出检查等功能也充分保证了C#程序的安全稳定。4支持多线程多线程是当今软件技术的又一重要成果,已成功应用在操作系统、应用开发等多个领域。多线程技术允许同一个程序有多个执行线索,即同时做多件事情,满足了一些复杂软件的需求。C#中定
23、义了一些用于建立、管理多线程的类和方法,使得开发具有多线程功能的程序变得简单、容易和有效。在C#新版本中还支持异步编程、并行编程等高级特性。5C#丰富的类库使得C#可以广泛地应用C#提供了大量的类,以满足网络化、多线程、面向对象系统的需要。(1)语言包提供的支持包括字符串处理、多线程处理、异常处理、数学函数处理等,可以用它简单地实现C#程序的运行平台。(2)实用程序包提供的支持包括哈希表、堆栈、可变数组、时间和日期等。(3)输入输出包用统一的“流”模型来实现所有格式的I/O,包括文件系统、网络、输入/出设备等。(4)图形用户界面的功能强大,不仅能实现Windows窗口应用程序,而且可以实现We
24、b窗体应用。(5)能用相应的类来实现从低级网络操作到高层网络应用。C#的上述种种特性不但能适应网络应用开发的需求,而且还体现了当今软件开发方法的若干新成果和新趋势。在以后的章节里,将结合对C#语言的讲解,分别介绍这些软件开发方法。6灵活性和兼容性在简化C+语法的同时,C#并没有失去灵活性。正是由于其灵活性,C#允许与C风格的需要传递指针型参数的API进行交互操作,DLL的任何入口点都可以在程序中进行访问。C#遵守.NET公用语言规范Common Language Specification(CLS)从而保证了C#组件与其它语言(如Visual Basic,Visual C+,JScript,J
25、#等)的组件间的互操作性。1.1.4 C#和C、C+的比较对于变量声明、参数传递、操作符、流控制等,C#使用了和C、C+相同的传统,使得熟悉C、C+的程序员能很方便地进行编程。同时,C#为了实现其简单、健壮、安全等特性,也摒弃了C和C+中许多不合理的内容。下面选择几点,对于学过C语言或C+语言的读者而言,起一个快速参考的作用。对于未学过C语言的读者,可以略过此节。(1)全局变量C#程序中,不能在所有类之外定义全局变量,只能通过在一个类中定义公用、静态的变量来实现一个全局变量。C#对全局变量进行了更好的封装。而在C和C+中,依赖于不加封装的全局变量常常造成系统的崩溃。(2)gotoC#支持有限制
26、的goto语句,并通过例外处理语句try、catch、finally等来处理遇到错误时跳转的情况,使程序更可读且更结构化。在一些细节上,也做了较好的处理,如switch语句中的case不会任意地贯通。(3)指针指针是C、C+中最灵活,也是最容易产生错误的数据类型。由指针所进行的内存地址操作常会造成不可预知的错误,同时通过指针对某个内存地址进行显式类型转换后,可以访问一个C+中的私有成员,从而破坏安全性,造成系统的崩溃。而C#对指针进行完全的控制,程序只能有限制地使用指针操作。同时,数组作为类在C#中实现,很好地解决了诸如数组访问越界等在C、C+中不作检查的错误。(4)内存管理在C中,程序员通过
27、库函数malloc()和free()来分配和释放内存,C+中则通过运算符new和delete来分配和释放内存。再次释放已释放的内存块或未被分配的内存块,会造成系统的崩溃;同样,忘记释放不再使用的内存块也会逐渐耗尽系统资源。而在C#中,所有的数据结构都是对象,通过运算符new为它们分配内存堆。通过new得到对象的处理权,而实际分配给对象的内存可能随程序运行而改变,C#对此自动地进行管理并且进行垃圾收集,有效地防止了由于程序员的误操作而导致的错误,并且更好地利用了系统资源。(5)数据类型的支持在C、C+中,对于不同的平台,编译器对于简单数据类型如int、float等分别分配不同长度的字节数,例如:
28、int在IBM PC中为16位,在VAX-11中为32位,这导致了代码的不可移植性,但在C#中,对于这些数据类型总是分配固定长度的位数,如对int型,它总占32位,这就保证了C#的平台无关性。(6)类型转换在C、C+中,可以通过指针进行任意的类型转换,常常带来不安全性,而C#中,运行时系统在处理对象时要进行类型相容性检查,以防止不安全的转换。(7)头文件C、C+中用头文件来声明类的原型以及全局变量、库函数等,在大的系统中,维护这些头文件是很困难的。而C#不支持头文件,类成员的类型和访问权限都封装在一个类中,运行时系统对访问进行控制,防止对私有成员的操作。(8)结构和联合C、C+中的结构和联合中
29、所有成员均为公有,这就带来了安全性问题。C#中不包含联合,而且对结构进行了更好的封装。1.1.5 C# 与Java 的比较C#与Java在很多方面具有相似性,同时也有一些重要的差别。C#和Java的相似之处主要包括:(1)二者都编译成跨平台的、跨语言的代码,并且代码只能在一个受控制的环境中运行。(2)自动回收垃圾内存,并且消除了指针(在C#中可以使用指针,不过必须注明unsafe关键字)。(3)都不需要头文件,所有的代码都被限制在某个范围内,并且因为没有头文件,所以消除了类定义的循环依赖。(4)都是严格的面向对象的语言。(5)都具有接口(interface)的概念。(6)都支持异常处理。(7)
30、都支持多线程。(8)都支持元数据,不过,在C#中叫attribute,在Java中叫annotation。(9)都支持Lambda表达式。(10)都支持泛型。C#在另外一些方面又与Java不同:(1)C#中的所有数据类型都是object的子类型,而Java中的数据类型分成基本数据类型及引用数据类型,只有引用类型是Object的子类型。(2)C#中的数据类型中,增加了struct结构类型,而Java中没有结构类型。(3)C#中的属性(property)的概念与字段(field)概念相分离,而Java中属性和域是用同一概念。(4)C#中的委托、事件机制能更好地处理函数指针及回调函数,而Java中只
31、有依靠接口等方法来实现。(5)C#中的数组类型使用起来也更方便。C#中还增加了索引器(indexer)的概念。(6)C#中没有Java中的内部类和匿名类的概念,只有嵌套类的概念。(7)C#中可以有限制地保留指针及goto语句。(8)C#中可以有异步编程。(9)C#更多的地支持动态语言特点。(10)C#中有更多的语法糖,即可以更方便地书写一些特定的语句。除以上一些方面的不同之外,C#中的一些细节在实现上与Java有一定的差别,比如,有关继承、访问控制、对象初始化的过程等等,这些方面的差别对于已学过Java的读者,要引起注意。虽然在大部分编程的任务中不会触及到这些差别,但对于一些特定的情形,可能会
32、引起意想不到的错误。本书在讲解相关的细节时,会考虑到这些读者的需要,进行一些必要的介绍。1.2 简单的C#程序在讨论更多的细节之前,先看几个简单的C#程序,目的是对C#程序有一个初步的认识。C#程序有很多种类型,最常用的是控制台应用程序和Windows窗体应用程序。前者是文本界面方式,后者是窗口图形界面方式。1.2.1 Hello World学习一门语言,一般从简单的“Hello World”开始,下面是一个简单的C#程序。例 STYLEREF 1 s 1 SEQ 例 * ARABIC s 1 1 HelloWorld.cs 一个简单程序。/* 简单的C#示例程序。 为HelloWorld.c
33、s。*/1using System;2class HelloWorld 3/C#调用Main()作为程序的开始。4public static void Main() 5Console.WriteLine(Hello World.);67本程序的作用是输出下面一行信息:Hello World!整个程序是保存在一个名为HelloWorld.cs的文件中的。一般说来,C#的源程序文件名都是以.cs作为扩展名的。文件名本身没有强制性的规定,但最好能表示程序的作用,或者与其中的主要类的名字保持一致。注意,为了讲解的需要,本书中的每行程序前面加的数字是行号,在实际书写程序时是不用输入行号的。另外,例子前面
34、的文件名.cs表示本书配套电子资源源代码的文件名,如果名字后面没有加.cs则表示是一个文件夹名或项目名。程序中,由/*及*/所包含的一段是程序的注释。另外,由/直到行尾的部分也是注释。下面针对该程序的几个方面进行讲解。1名字空间using System 表示导入名字空间(namespace)。高级语言总是依赖于许多系统预定义的元素,在C#中使用using System表示导入系统已定义好的名字空间,这方便以后的使用。下文要用到的Console的全称是System.Console;当程序的前面使用了using System后,使用System.Console的地方就可以简写为Console。在一
35、定意义上,using大致相当于C/C+中的#include或者java语言中的import。2类和类的方法C#是面向对象的语言,在进行编程的主要任务就是要定义类及类的方法。程序中,用关键字class来声明一个新的类,其类名为HelloWorld。整个类定义由大括号括起来。在类的定义中,一个主要任务是定义方法。方法相当于函数,但它必须位于类的定义之中。在该类中定义了一个Main()方法,其中public表示访问权限,指明所有的类都可以使用这一方法;static指明该方法是一个静态方法,这种方法不用创建对象实例即可调用;void则指明Main()方法不返回任何值。3程序的入口一个应用程序都有一个程
36、序入口,程序的执行就从这里开始。在C#中是用Main()方法为表示程序入口的。值得注意的是,作为程序入口的Main()方法必须是static方法。Main方法可以不为public,可以不带参数,返回值可以为void或int,所以Main()方法有多种形式。另外,要注意Main的首字母大写。Main()方法定义中,可以在括号()中的加入string args,表示是传递给Main()方法的参数,参数名为args。Main()方法的参数实际就是命令行参数。public static void Main( string args )在C#中这个参数也可以没有,正如前面的程序中所示。4程序的输入和输出
37、在Main()方法的实现(大括号中),只有一条语句:Console.WriteLine (Hello World!);它用来实现字符串的输出,这条语句实现与C语言中的printf语句和C+中cout语句相同的功能。另外,/后的内容为注释。程序所完成的输入输出功能都是通过Console 来完成的。Console是在名字空间System中定义的类,它表示控制台输入输出设备,一般指键盘和显示器。Console类有两个最基本的方法WriteLine和ReadLine,Console.ReadLine表示接受输入设备输入,Console.WriteLine则用于在输出设备上输出。另外,Console中用
38、于输入输出的另两个方法Read和Write,它们与ReadLine、WriteLine的不同之处在于:ReadLine和WriteLine执行时多加了一个回车键。程序的运行结果如 REF _Ref41110436 h 图 14所示。注意其中显示的信息是程序的输出结果,而外面的窗口框架是运行时的环境窗口,与程序本身无关。图 STYLEREF 1 s 1 SEQ 图 * ARABIC s 1 4 HelloWorld的运行结果5使用Visual Studio建立“Hello World”建立程序最简单的办法莫过于使用Visual Studio,Microsoft提供的Visual Studio是C
39、#程序开发的集成环境,其免费版本和收费版本都可以从网站下载。关于更多的开发工具的情况在下节会详细讲到,这里谈谈如何用它来建立一个简单的控制台应用程序“Hello World”。使用Visual Studio来开发应用程序主要包括以下几个步骤:(1)新建一个项目:Visual Studio将程序组织到项目(project)中,而多个项目又集合到一个解决方案中(solution),所以编程时需要新建项目(同时会自动建立解决方案)。打开Visual Studio,使用菜单“文件|新建项目”,选择“已安装|模板|Visual C#|Windows经典桌面|控制台应用(.NET framework)”。
40、对话框如 REF _Ref41127359 h 图 15所示。图 STYLEREF 1 s 1 SEQ 图 * ARABIC s 1 5 新建项目对话框填好项目名称、选好位置、解决方案名称(解决方案solution是指多个项目放在一起,默认与第一个项目的名称是一样的),单击“确定”,Visual Studio开始生成应用程序的雏形,如 REF _Ref41127452 h 图 16所示。图 STYLEREF 1 s 1 SEQ 图 * ARABIC s 1 6 应用程序的雏形(2)修改代码:系统已经产生了Program类,其中含有Main()方法,我们可以在其中添加代码。输入“Console.
41、”,能看到系统自动列出了Console类的相关方法,如 REF _Ref41127676 h 图 17所示。图 STYLEREF 1 s 1 SEQ 图 * ARABIC s 1 7 Console类的相关方法选择或手工输入WriteLine,然后写入下面这一行:Console.WriteLine(Hello World!);提示:Visual Studio中书写代码特别方便,输入cw并按两次Tab键,系统会自动生成Console.WriteLine();语句。输入svm并按两次Tab键,系统会自动生成static void Main(string args) 。(3)编译并运行程序:可以按C
42、trl+F5来自动编译并运行,或者按F5进行调试运行。从“Debug”(调试)菜单中选择“Start Without Debugging”(不调试启动)。也可按按钮,进行调试运行。若程序成功运行,则控制台显示出“Hello From Visual Studio”的信息。提示:对于控制台应用程序,如果按F5调试运行,显示信息可能一闪而过,这是因为程序执行完成了。可以三种方法来解决这个问题:一是使用Ctrl+F5来运行(非调试);二是在Main()内加一条语句Console.ReadLine()来等待用户输入回车;三是使用菜单“视图|输出”或按Ctrl+W,O这里表示Ctrl+W或Ctrl+O?来
43、打开输出窗口进行查看。1.2.2 C#程序设计快速入门这里介绍使用Visual Studio建立及运行一个简单的Windows应用程序的过程。1新建项目Visual Studio将程序组织到项目(project)中,而多个项目又集合到一个解决方案中(solution),所以编程时需要新建项目(同时会自动建立解决方案)。在Visual Studio中选择使用“文件|新建项目”,选择“已安装|模板|Visual C#|Windows经典桌面|Windows窗体应用(.NET framework)”,如 REF _Ref480188647 h 图 18所示。图 STYLEREF 1 s 1 SEQ
44、图 * ARABIC s 1 8 新建项目对话框填写项目名后,点击“确定”,Visual Studio为新窗体增加了一个Form1.cs文件,其中包括了这个窗体的代码,如 REF _Ref41127949 h 图 19所示。图 STYLEREF 1 s 1 SEQ 图 * ARABIC s 1 9 Visual Studio工作界面工作界面上,上边是菜单,左边是工具箱,中间是窗体设计及代码编写区,右边是解决方案管理器。2添加控件并设置属性要向一个窗体中添加控件或者子窗口,需要打开工具箱(ToolBox)。点击菜单“视图|工具箱”,激活工具箱功能。默认情况下在整个工作界面的左边,如 REF _R
45、ef41128476 h 图 110所示。现在就可以添加控件了,展开工具箱上的“所有Windows窗体控件”或“公共控件”可以看见其中有很多工具,添加方法可以拖放到窗体上或者单击某个工具再单击窗体。首先可以在窗体右下角拖动使窗体变大一些,然后拖动工具箱中的按钮(Button)和文本框(TextBox)到窗体上,从而在窗体上放下一个按钮和一个文本框,如 REF _Ref41128476 h 图 110所示。图 STYLEREF 1 s 1 SEQ 图 * ARABIC s 1 10 在窗体上放置一个按钮和一个文本框在控件上点击右键,并点中“属性”菜单条就可以调出属性窗口,在属性窗口中设置控件的属
46、性,如 REF _Ref41128666 h 图 111所示,可以将按钮的Text属性设置成“产生随机数”。 图 STYLEREF 1 s 1 SEQ 图 * ARABIC s 1 11 设置控件的属性3添加事件处理程序最后,要为按钮增加事处理程序,实现按钮点击后执行的程序。在按钮上双击,打开Button1_Click事件处理器。private void button1_Click(object sender, System.EventArgs e)Random rnd = new Random();this.textBox1.Text = rnd.Next().ToString();这段程序
47、的目的是,生成一个随机数对象,并产生下一个随机数,并转成文本放到文本框中。一般地说,在窗体设计界面上双击相应的对象(按钮、标签、文本框以及窗体本身)都可以自动打开代码窗口进行事件处理,这里的事件是该对象的默认事件(如按钮的Click事件、文本框的Change事件)。如果要对其他事件进行代码编写,则可以在属性窗格上点击闪电状的图标,则可以打开事件窗格,如 REF _Ref480192308 h 图 112所示,双击需要的事件就可以添加相应的事件处理代码。如果要去掉事件处理代码,可以在事件窗格中按Delete键将该事件置为空。图 STYLEREF 1 s 1 SEQ 图 * ARABIC s 1
48、12 事件窗格4编译并运行程序按F5或Ctrl+F5或按钮编译并运行这个程序。结果如 REF _Ref41128736 h 图 113所示,点击按钮可以看见产生的随机数。图 STYLEREF 1 s 1 SEQ 图 * ARABIC s 1 13 程序运行结果完整的程序如下(行号由作者所加):1using System;2using System.Drawing;3using System.Collections;4using System.ComponentModel;5using System.Windows.Forms;6using System.Data;78namespace Win
49、dowsApplication1910/ 11/ Form1 的摘要说明。12/ 13public class Form1 : Form1415public Form1()1617InitializeComponent();1819private void button1_Click(object sender, System.EventArgs e)2021Random rnd = new Random();22this.textBox1.Text = rnd.Next().ToString();2324255关于自动生成的代码从上面的过程可以看出,集成开发环境帮我们做了很多事情,其中界面设
50、计的过程会自动生成代码,为了查看这个代码,需要使用“解决方案管理器”顶部的“显示所有文件”工具按钮,如 REF _Ref485373709 h 图 114所示。图 STYLEREF 1 s 1 SEQ 图 * ARABIC s 1 14 “显示所有文件”工具按钮在“解决方案管理器”中,展开Form1.cs就能看到Form1.Designer.cs,双击这个文件就可以看见设计器自动生成的代码,这个代码最好不要手工编辑,以免出错。其中可以看到:有一个默认的名字空间以及对WinForms所要求的不同名字空间的引用(using);Form1类是从系统的Form中派生出来的;InitializeComp
51、onent方法负责初始化(创建)窗体及其控件(当在窗体中拖放下一些控件时,可以看到它的更多细节);Dispose方法负责清除所有不再使用的资源。1.2.3 对象的三个基本要素C#的程序都是面向对象的,对象是其中的核心概念。对象是现实世界的物体的抽象。在C#中的对象包括界面对象,如窗体、按钮、标签,也包括一些非界面的对象,如字符串、集合、书、人等等。在C#程序设计就是要设计这些对象。C#对象可以很复杂,可以有很多要素,但是一般地说,C#对象有三个基本的要素:属性、方法和事件。1属性(property)属性的概念是用于表示对象的状态的,一般使用名词或形容词表示。在C#中对象与属性之间用一个小数点“
52、.”连接。例如:button1.Width表示按钮宽度,button1.Height表示按钮的高度,label1.ForeColor表示标签的前景色等等。可以认为属性相当于对象中的一个变量。在Visual Studio中,界面对象上右击,选“属性”可以打开属性窗口,或者直接按F4也可以打开属性窗口,如 REF _Ref41126065 h 图 122所示。一个对象常常有多个属性,其中表示列出属性,表示按字母顺序排列,表示按分类顺序排列。如果知道属性名,则按字母顺序排列更容易查找一些。图 STYLEREF 1 s 1 SEQ 图 * ARABIC s 1 15 属性窗口有两种方式使用属性,一是给
53、属性赋值(称为set),如button1.Width=100表示使得其宽度为100;另一种方式是取得属性当前的值(称为get),如a=button1.Width表示取得其宽度值并记录到变量a中。2方法(method)方法是用于表示对象的功能、动作的,一般使用动词。在C#中对象与方法之间也是用一个小数点“.”连接。例如:this.Show()表示显示当前窗体对象,Console.WriteLine(hello!);表示显示一行文本。可以认为方法相当于对象中的函数,所以在使用时,需要带上圆括号,有时还需要带上参数。例如自动生成的代码中components.Dispose()、this.Resume
54、Layout(false)等都是调用方法。3事件(event)事件是用于表示对象的状态改变,是一种通知或消息机制,一般使用动词原形或分词形式。在C#中对象与事件之间也是用一个小数点“.”连接。例如:button1.Click表示按钮被点击,this.MouseMove表示当前窗体上鼠标移动事件发生,this.Load表示窗体载入到内存的事件发生。在Visual Studio中,界面对象上双击,可以打开该对象的默认事件(最常用事件),并对该事件进行编程。对于更多的事件,则在界面对象上右击,或者按F4也可以打开属性窗口。点击其中有一个闪电状图标可以列出该对象的所有事件,如 REF _Ref4800
55、33185 h 图 116所示。双击其中的事件,则可以打开代码窗口进行代码的编写。图 STYLEREF 1 s 1 SEQ 图 * ARABIC s 1 16 属性窗口中的事件事件在本质上是一种状态变化后对外界的消息通知,针对这个事件进行编程实际上就是处理这个消息。为了处理某个消息,需要先注册这个消息,以便让事件发生后通知调用者。Visual Studio中双击相应事件时,系统会自动生成这个事件注册的代码,这些代码在一个.Designer.cs中可以看到。使用“视图|解决方案管理器(Ctrl+Alt+L)”打开解决方案管理器(该管理器默认是打开的),展开Form1.cs,可以看见有个Form1
56、.Designer.cs文件,如 REF _Ref41126065 h 图 122所示。图 STYLEREF 1 s 16 图号错 解决方案管理器中展开窗体文件双击Form1.Designer.cs可以看到Windows 窗体设计器生成了这样的代码:this.button1.Click += new System.EventHandler(this.button1_Click);如果我们手写编写,也可以这样写:对象.事件 += 函数名它表示对象的事件注册了一个函数,也就是说事件发生后,会调用该函数。简单地说,使用事件的基本方法就是+=函数名。在Visual Studio中编写代码时,在对象后面
57、输入点后,系统会智能提示出它所有的属性、方法和事件。在事件名后面输入+=再连续按两次Tab键,系统会自动生成一个函数名及其函数头,我们就可以在函数中填写事件的处理代码了。总之,对象的三个基本要素是属性、方法和事件,在Visual Studio中处理属性、方法、事件都是很方便的。1.2.4 C#程序的基本构成C#的程序可以很简单,也可以很复杂。下面就C#程序的常见成分进行一个初步的介绍。一个程序可由一个至多个C#源程序文件构成,每个文件中可以有多个类定义。下面的程序是一个更一般的C#程序文件。例 STYLEREF 1 s 1 SEQ 例 * ARABIC s 1 2 一个简单的窗口程序1usin
58、g System;2using System.Drawing;3using System.Windows.Forms;4namespace ch0156public class HelloWorldWin : System.Windows.Forms.Form78public HelloWorldWin()910InitializeComponent();1112private void InitializeComponent()1314this.ClientSize = new System.Drawing.Size(200, 180);15this.Name = HelloWorldWin
59、;16this.Text = HelloWorldWin;17this.Paint += new System.Windows.Forms.PaintEventHandler(18this.HelloWorldWin_Paint);1920static void Main() 2122Application.Run(new HelloWorldWin();2324private void HelloWorldWin_Paint(25object sender, System.Windows.Forms.PaintEventArgs e)2627e.Graphics.DrawString( He
60、llo, world, 28new Font(Curior New, 12f ), 29new SolidBrush( Color.Blue), 3050f, 100f, null);313233这个程序与上一个例子相似,但它是手工书写的。下面来分析这个程序的组成:从这个例子可以看出,一般的C#源程序文件由以下三部分组成:using 语句 类型定义 namespace 其中,using语句表示引入其他类的库,以方便使用。using语句可以有0到多句,它必须放在类型定义的前面。 namespace,表示类所在的名字空间。namespace的花括号内,可以嵌套一些using语句、类型定义或者nam
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 祖国在我心中话题演讲稿(32篇)
- 小学科学教学工作总结13篇
- 就业前景的调研报告范文8篇
- 安徽省合肥市2025届高三上学期教学诊断检测(四)数学含答案
- 2024年金属基超硬材料项目投资申请报告代可行性研究报告
- 陕西省榆林市(2024年-2025年小学五年级语文)统编版专题练习(上学期)试卷及答案
- 湖北省武汉市(2024年-2025年小学五年级语文)人教版期末考试((上下)学期)试卷及答案
- 2024年饮料、酒及酒精专用原辅料项目投资申请报告代可行性研究报告
- 高考生物一轮专题突破练专题一细胞的分子组成和结构功能教案
- 上海市市辖区(2024年-2025年小学五年级语文)人教版摸底考试((上下)学期)试卷及答案
- 交通银行面试真题及答案详解
- 西泠版五年级书法上册《第10课 山字头与京字头》教学设计
- 2022年湖南省衡南县五科联赛数学试卷
- 布氏硬度对照表
- 一年级数学老师家长会发言稿
- 湖北省旅游PPT简介湖北省幻灯片模板
- 小学数学解题研究全套教学课件
- 精算模型真题模拟汇编(共704题)
- 大学生创新创业PPT完整全套教学课件
- 急性脑梗死的桥接治疗课件
- 《中国工艺美术史》考研备考题库(知识点整理)
评论
0/150
提交评论