1 简单的程序谢新冲.docx

上传人:b****7 文档编号:26538041 上传时间:2023-06-20 格式:DOCX 页数:74 大小:568.90KB
下载 相关 举报
1 简单的程序谢新冲.docx_第1页
第1页 / 共74页
1 简单的程序谢新冲.docx_第2页
第2页 / 共74页
1 简单的程序谢新冲.docx_第3页
第3页 / 共74页
1 简单的程序谢新冲.docx_第4页
第4页 / 共74页
1 简单的程序谢新冲.docx_第5页
第5页 / 共74页
点击查看更多>>
下载资源
资源描述

1 简单的程序谢新冲.docx

《1 简单的程序谢新冲.docx》由会员分享,可在线阅读,更多相关《1 简单的程序谢新冲.docx(74页珍藏版)》请在冰豆网上搜索。

1 简单的程序谢新冲.docx

1简单的程序谢新冲

第1章简单的C#程序

本章介绍C#语言的特点,并讲述开发C#程序的基本步骤、C#程序的构成、基本输入输出编程以及C#的开发工具。

通过本章的学习,可以对C#程序有一个初步的认识。

1.1C#语言简介

C#(发音为“CSharp”)是由Microsoft开发的一种新型编程语言。

由于它是从C和C++中派生出来的,因此具有C++的功能。

同时它又像VisualBasic一样简单。

对于web开发而言,C#则与Java相似。

可以说,C#吸收了传统的各种语言的优点,是迄今为止最为优秀的语言之一。

Microsoft公司也宣称,C#是开发框架应用程序的最好语言。

C#是一种面向对象和类型安全的编程语言,它具有相当严格的面向对象的特点。

由于它由C和C++、Java等语言的语法有一定的相似性,并且避免了其他语言中一些容易出错、难于使用的成份,所以它可以很快被C和C++、Java程序员所熟悉;由于它的开发环境与VisualBasic等集成化开发环境相似,所以它也便于VisualBasic程序员使用,并且可以大大提高程序开发的效率。

可见,学习C#语言不仅必要,而且是可以学得好的。

1.1.1C#的产生与发展

C#是直接从世界上最成功的计算机语言C和C++继承而来,又与Java紧密相关。

理解C#的产生与发展有助于C#的学习。

1.结构化编程与C语言

C语言的产生标志着现代编程时代的开始。

C语言是20世纪70年代由DennisRitchie在基于UNIX操作系统上创建的。

在一定意义上,20世纪60年代的结构化编程造就了C语言。

在结构化编程语言产生之前,大型的程序是很难编写的。

因为往往在编写大型程序的时候,会由于存在大量的跳转、调用和返回很难进行跟踪调试。

结构化的编程语言加入了优化定义的控制语句,子程序中采用了局部变量和其他的改进,使得这种问题得到了解决。

C语言是结构化编程语言中最为成功的一种,至今C语言仍用常用的语言之一。

2.面向对象编程与C++语言

可是,C语言还是有它自身的局限性。

到了20世纪70年代末期,很多项目的代码长度都接近或者到达了结构化编程方法和C语言能够处理的极限。

为了解决这个问题,出现了新的编程方法,即面向对象编程(简称OOP),程序员使用OOP可以编写出更大型的程序。

1979年初,BjarneStroustrup在贝尔实验室创造了C++。

C++是C的面向对象的版本。

对于C程序员,可以方便地过渡到C++,从而进行面向对象的编程。

20世纪90年代中期,C++成为广泛使用的编程语言。

3.网络的发展与Java语言

随着网络的发展,编程语言进入到的下一个主流就是Java。

Java的创造工作由1991年在Sun公司开始,其主要发明者是JamesGosling。

Java是一种面向对象的语言,它的语法和思想起源于C++。

Java最重要的一方面是具有编写跨平台、可移植代码的能力,Java能够将一个程序的源代码转换到被称为字节码的中间语言,实现了程序的可移植性。

该字节码在Java虚拟机上被执行。

因此,Java程序可移植到有Java虚拟机的任何环境中。

由于Java虚拟机相对比较容易实现,所以适用于大部分的环境。

在Java中采用中间语言是很重要的,在其后的C#中采用了类似的方案。

4.C#语言的产生

Microsoft公司在20世纪90年代末开发了C#,其首席设计师是AndersHeilsberg。

图11展示了C#的家族史。

c#的祖父是C,C#继承了C的语法、关键词和运算符。

C#建立在C++定义的对象模型基础上,并加以改进。

图11C#的演变

Java起源于C和C++,它与C/C++的语法有很多相似之处。

C#并不是源于Java。

相反,C#和Java都起源于C,但是发展道路不同。

学习Java和学习C#,许多知识是相同或相似的。

C#包含了许多创新的特性,这将会在本书中进行详细的讲解。

1.1.2C#的环境——Microsoft.NET

尽管C#是一种可以单独学习的计算机编程语言,但是它与其运行期环境——Microsoft.NET框架仍然有密切联系。

究其原因有二:

其一,微软最初设计C#语言是为了编写.NET框架;其二,C#使用的函数库是.NET框架定义的函数库中的一部分。

因此,虽然可以把C#与.NET环境分开,但是它们实际上是密切联系的。

由于以上原因,对.NET框架有一个基本了解是非常必要的。

事实上,本书不仅介绍C#语言本身,还介绍C#语言在.NET环境中的应用。

1.什么是Microsoft.NET框架

Microsoft.NET是一个综合性的术语,它描述了微软公司最近才发布的许多技术。

总的说来,Microsoft.NET包括以下技术领域:

.NET框架(.NETFramework)

.NET企业版服务器

.NET语言和语言工具

其中.NET框架定义了一种支持开发和执行与平台无关的应用程序的环境。

它使得不同的计算机语言能协同工作,并提供了程序的安全性、可移植性以及对Windows平台的统一编程模式。

值得注意的是.NET框架并不局限于Windows平台(尽管Windows是目前唯一适用的环境),这也就是说,程序员用C#编写的程序将来可能也适用于非Windows环境。

.NET框架定义了两个重要的实体。

一个是公共语言运行环境(CommonLanguageRuntime,CLR),它管理程序的执行,它还是.NET框架中使程序具有可移植性、支持混合语言编程、并且提供安全机制的一部分。

另一个是.NET类库,它给程序提供访问运行期环境的能力。

这些类库提供了包括输入输出、图形用户界面、网络功能、数据库访问等多方面的功能。

C#自动使用了.NET类库,因此C#程序能自动移植到所有的.NET平台。

2.公共语言运行环境

公共语言运行环境(CLR)管理.NET代码的执行。

下面是它的工作原理:

当编译C#程序时,编译器并不输出可执行代码,而是一种特殊的伪代码。

这些伪码被称为微软中间语言(MicrosoftIntermediateLanguage,简称MSIL)。

MSIL定义了一系列与CPU类型无关的可移植指令集。

从本质上说,MSIL定义了一种可移植的汇编语言。

当程序运行时,CLR负责把中间代码翻译(解释)成可执行代码。

从这个角度说,任何被编译成MSIL的程序都能运行在实现了CLR的环境下。

这就是为什么.NET框架具有可移植性的原因。

可以用JIT编译器把MSIL转换成可执行代码。

JIT代表“JustInTime”。

转换过程是:

当.NET程序运行时,CLR激活JIT编译器,JIT编译器根据程序的需要,把MSIL转换成机器指令(本地代码)。

因此尽管C#程序最初被编译成MSIL,它实际上是以本地代码运行的,这意味着程序的运行速度几乎与最初就把它编译成本地代码一样快。

除了MSIL,当编译C#程序时输出的另一部分是元数据(Metadata)。

元数据用来描述在程序中使用的数据,它使得程序可以与其他的代码交互,并与MSIL位于同一个文件中。

元数据可以由编译程序自动生成,并与编译后的MSIL指令共同包含在二进制代码文件中。

元数据携带了源代码中类型信息的描述,程序使用的类型描述与其自身绑定在一起,这在一定程度上解决了版本问题。

在CLR定位与装载类型时,系统通过读取并解析元数据来获得应用程序中的类型信息,由于整个过程中CLR始终根据元数据建立并管理对应特定应用程序的类型,从而保证了类型安全性。

在实际的编程中,没有必要对CLR、MSIL或元数据进行更多的了解,因为大部分工作是由Microsoft.NET框架来完成的。

3.受控与非受控代码

—般来说,当编写一个C#程序时,创建的程序被称为受控代码(managedcode)。

由于受控代码是在CLR的控制下执行,因此受到一些限制,当然也获得一些好处。

受到的限制有:

编译器必须产生面向CLR的MSIL文件,必须使用.NET框架库函数(如同C#那样)。

受控代码的优点有:

现代存储管理、提供混合语言编程的能力、更好的安全性、支持版本控制以及提供软件组件间交互的简单方式。

与受控代码相对应的是非受控代码(unmanagedcode),非受控代码的执行不受CLR的控制。

在.NET框架以前的所有Windows程序都是非受控代码。

因为受控代码和非受控代码是可以共同运行的,所以事实上C#程序可以与以前的程序并存(在本书的最后一章介绍了这样的例子)。

4.公共语言规范

尽管所有的受控代码都获得CLR带来的好处,但如果代码将被用其他语言所编写的程序使用,为了达到最大的可用性,它还必须遵守公共语言规范(CLS)。

CLS描述了不同的编程语言都应具有的特征集,比如程序中使用一些通用的数据类型,而不使用一些特定的数据类型。

当编写要被其他语言调用的程序组件时,遵循CLS显得尤其重要。

.NET跨语言集成的特性来自于虚拟对象系统(VOS)的支持。

在不同语言间进行代码复用和应用集成中要求不同语言的类型系统要具有相容性。

在传统的语言中,相容性问题是突出的,例如同样是整数类型在C++中的长度是32位而在VisualBasic中却是16位,而日期时间与字符串类型在这方面的区别就更加明显了。

VOS的建立就是为了改变这种状况,它既支持过程性语言,也支持面向对象的语言,同时提供了一个类型丰富的系统来容纳它所支持的各种语言的特性。

它在最大程度上屏蔽了不同语言类型系统间的转换,使程序员能够随心所欲地选择自己喜欢的语言。

5.开发工具

.NET为使用与开发人员提供了功能强大种类丰富的管理与开发工具。

正是由于有了它们的支持,.NET才变得如此强大。

这些工具包括:

VisualStudio.NET是.NET的核心开发工具,以及一些相关的工具,如编译、连接、反汇编、证书管理、注册工具、XML工具等等。

1.1.3C#的特点

C#代表着编程语言演变的一个新阶段,它继承了C++和Java这两种世界上最重要的语言的优点,并且还增加了指代、索引等创新性特点;同时,C#语言利用了.NET作为其强大的平台,使得它在Windows图形用户界面、ASP.NETWeb应用、XmlWebService及ADO.NET数据库等方面有广泛的应用。

下面从学习和使用的角度来介绍C#的特点。

当读者学完本书后会对C#语言的这些特点有更深的理解。

1.简单易学

衍生自C++的C#语言,除去了C++中不容易理解和掌握的部分,如最典型的指针操作、ALT、#define宏等,降低了学习的难度;同时C#还有一个特点就是它的基本语法部分与C++、Java语言几乎一模一样。

这样,无论是学过C#再学C++、Java,还是已经掌握了C++、Java语言再来学C#,都会感到易于入门。

2.面向对象

C#是面向对象的编程语言。

面向对象技术较好地适应了当今软件开发过程中新出现的问题,包括软件开发的规模扩大、升级加快、维护量增大以及开发分工日趋细化、专业化和标准化等,是一种迅速成熟、推广的软件开发方法。

面向对象技术的核心是以更接近于人类思维的方式建立计算机逻辑模型,它利用类和对象的机制将数据与其上的操作封装在一起,并通过统一的接口与外界交互,使反映现实世界实体的各个类在程序中能够独立、自治、继承;这种方法非常有利于提高程序的可维护性和可重用性,大大提高了开发效率和程序的可管理性,使得面向过程语言难于操纵的大规模软件可以很方便的创建、使用和维护。

C#具有面向对象的语言所应有的一切特性如封装、继承与多态。

在C#的类型系统中每种类型都可以看作一个对象,甚至对基本类型,C#提供了一个叫做装箱(boxing)机制,使其成为对象。

3.与Web的紧密结合

C#程序能方便与Web程序进行集成。

利用ASP.NET的强大功能,C#能与Web标准,如HTML和XML相结合。

C#还能方便地开发WebService,紧密地结合SOAP,使得C#开发大规模深层次的分布式应用成为可能。

由于有了Web服务框架的帮助,对程序员来说网络服务看起来就像是C#的本地对象,程序员们能够利用已有的面向对象的知识与技巧开发Web服务。

仅需要使用简单的C#语言结构,C#组件将能够方便地为Web服务并允许它们通过Internet被运行在任何操作系统上的任何语言所调用。

4.安全稳定

对网络上应用程序的另一个需求是较高的安全可靠性。

用户通过网络获取并在本地运行的应用程序必须是可信赖的,不会充当病毒或其他恶意操作的传播者而攻击用户本地的资源;同时它还应该是稳定的,轻易不会产生死机等错误,使得用户乐于使用。

C#特有的机制是其安全性的保障,同时它去除了C++中易造成错误的指针,增加了自动内存管理等措施,保证了C#程序运行的可靠性。

内存管理中的垃圾收集机制减轻了开发人员对内存管理的负担,.NET平台提供的垃圾收集器(GarbageCollection,GC)将负责资源的释放与对象撤销时的内存清理工作。

同时,变量的初始化、类型检查、边界检查、溢出检查等功能也充分保证了C#程序的安全稳定。

5.支持多线程

多线程是当今软件技术的又一重要成果,已成功应用在操作系统、应用开发等多个领域。

多线程技术允许同一个程序有多个执行线索,即同时做多件事情,满足了一些复杂软件的需求。

C#中定义了一些用于建立、管理多线程的类和方法,使得开发具有多线程功能的程序变得简单、容易和有效。

6.C#丰富的类库使得C#可以广泛地应用

C#提供了大量的类,以满足网络化、多线程、面向对象系统的需要。

(1)语言包提供的支持包括字符串处理、多线程处理、异常处理、数学函数处理等,可以用它简单地实现C#程序的运行平台。

(2)实用程序包提供的支持包括哈希表、堆栈、可变数组、时间和日期等。

(3)输入输出包用统一的“流”模型来实现所有格式的I/O,包括文件系统、网络、输入/出设备等。

(4)图形用户界面的功能强大,不仅能实现Windows窗口应用程序,而且可以实现Web窗体应用。

(5)能用相应的类来实现从低级网络操作到高层网络应用。

C#的上述种种特性不但能适应网络应用开发的需求,而且还体现了当今软件开发方法的若干新成果和新趋势。

在以后的章节里,将结合对C#语言的讲解,分别介绍这些软件开发方法。

7.灵活性和兼容性

在简化C++语法的同时,C#并没有失去灵活性。

正是由于其灵活性,C#允许与C风格的需要传递指针型参数的API进行交互操作,DLL的任何入口点都可以在程序中进行访问。

C#遵守.NET公用语言规范CommonLanguageSpecification(CLS)从而保证了C#组件与其它语言(如VisualBasic,VisualC++,JScript,J#等)的组件间的互操作性。

1.1.4C#和C、C++的比较

对于变量声明、参数传递、操作符、流控制等,C#使用了和C、C++相同的传统,使得熟悉C、C++的程序员能很方便地进行编程。

同时,C#为了实现其简单、健壮、安全等特性,也摒弃了C和C++中许多不合理的内容。

下面选择几点,对于学过C语言或C++语言的读者而言,起一个快速参考的作用。

对于未学过C语言的读者,可以略过此节。

(1)全局变量

C#程序中,不能在所有类之外定义全局变量,只能通过在一个类中定义公用、静态的变量来实现一个全局变量。

C#对全局变量进行了更好的封装。

而在C和C++中,依赖于不加封装的全局变量常常造成系统的崩溃。

(2)goto

C#支持有限制的goto语句,并通过例外处理语句try、catch、finally等来处理遇到错误时跳转的情况,使程序更可读且更结构化。

在一些细节上,也做了较好的处理,如switch语句中的case不会任意地贯通。

(3)指针

指针是C、C++中最灵活,也是最容易产生错误的数据类型。

由指针所进行的内存地址操作常会造成不可预知的错误,同时通过指针对某个内存地址进行显式类型转换后,可以访问一个C++中的私有成员,从而破坏安全性,造成系统的崩溃。

而C#对指针进行完全的控制,程序只能有限制地使用指针操作。

同时,数组作为类在C#中实现,很好地解决了诸如数组访问越界等在C、C++中不作检查的错误。

(4)内存管理

在C中,程序员通过库函数malloc()和free()来分配和释放内存,C++中则通过运算符new和delete来分配和释放内存。

再次释放已释放的内存块或未被分配的内存块,会造成系统的崩溃;同样,忘记释放不再使用的内存块也会逐渐耗尽系统资源。

而在C#中,所有的数据结构都是对象,通过运算符new为它们分配内存堆。

通过new得到对象的处理权,而实际分配给对象的内存可能随程序运行而改变,C#对此自动地进行管理并且进行垃圾收集,有效地防止了由于程序员的误操作而导致的错误,并且更好地利用了系统资源。

(5)数据类型的支持

在C、C++中,对于不同的平台,编译器对于简单数据类型如int、float等分别分配不同长度的字节数,例如:

int在IBMPC中为16位,在VAX-11中为32位,这导致了代码的不可移植性,但在C#中,对于这些数据类型总是分配固定长度的位数,如对int型,它总占32位,这就保证了C#的平台无关性。

(6)类型转换

在C、C++中,可以通过指针进行任意的类型转换,常常带来不安全性,而C#中,运行时系统在处理对象时要进行类型相容性检查,以防止不安全的转换。

(7)头文件

C、C++中用头文件来声明类的原型以及全局变量、库函数等,在大的系统中,维护这些头文件是很困难的。

而C#不支持头文件,类成员的类型和访问权限都封装在一个类中,运行时系统对访问进行控制,防止对私有成员的操作。

(8)结构和联合

C、C++中的结构和联合中所有成员均为公有,这就带来了安全性问题。

C#中不包含联合,而且对结构进行了更好的封装。

1.1.5C#与Java的比较

C#与Java在很多方面具有相似性,同时也有一些重要的差别。

C#和Java的相似之处主要包括:

1)二者都编译成跨平台的、跨语言的代码,并且代码只能在一个受控制的环境中运行。

2)自动回收垃圾内存,并且消除了指针(在C#中可以使用指针,不过必须注明unsafe关键字)。

3)都不需要头文件,所有的代码都被限制在某个范围内,并且因为没有头文件,所以消除了类定义的循环依赖。

4)都是严格的面向对象的语言。

5)都具有接口(interface)的概念。

6)都支持异常处理。

7)都支持多线程。

8)都支持类定义的嵌套。

C#在另外一些方面又与Java不同:

1)C#中的所有数据类型都是object的子类型,而Java中的数据类型分成基本数据类型及引用数据类型。

2)C#中的数据类型中,增加了struct结构类型,而Java中没有结构类型。

3)C#中的属性(Property)的概念与域(Field)概念相分离,而Java中属性和域是用同一概念。

4)C#中的指代、事件机制能更好地处理函数指针及回调函数,而Java中只有依靠接口等方法来实现。

5)C#中的数组类型使用起来也更方便。

C#中还增加了索引(Indexer)的概念。

6)C#中没有Java中的内部类和匿名类的概念,只有嵌套类的概念。

7)C#中增加了Attribute的概念,使之更好地处理元数据。

8)C#中的异常处理没有Java中区分成两种不同异常的区别。

9)C#中可以有限制地保留指针及goto语句。

除以上一些方面的不同之外,C#中的一些细节在实现上与Java有一定的差别,比如,有关继承、访问控制、对象初始化的过程等等,这些方面的差别对于已学过Java的读者,要引起注意。

虽然在大部分编程的任务中不会触及到这些差别,但对于一些特定的情形,可能会引起意想不到的错误。

本书在讲解相关的细节时,会考虑到这些读者的需要,进行一些必要的介绍。

1.2简单的C#程序及其构成

在讨论更多的细节之前,先看几个简单的C#程序,目的是对C#程序有一个初步的认识,也为后面的进一步学习打下基础。

1.2.1简单的控制台程序

下面是一个简单的控制台应用程序。

注意,为了讲解的需要,本书中的每行程序前面加的数字是行号,在实际书写程序时是不用输入行号的。

例11HelloWorld.cs一个简单程序

1/*

2这是一个简单的C#示例程序。

3程序名为HelloWorld.cs。

4*/

5usingSystem;

6classHelloWorld{

7//C#调用Main()作为程序的开始。

8publicstaticvoidMain(){

9Console.WriteLine("HelloWorld.");

10}

11}

本程序的作用是输出下面一行信息:

HelloWorld!

整个程序是保存在一个名为HelloWorld.cs的文件中的。

一般说来,C#的源程序文件名都是以.cs作为扩展名的。

文件名本身没有强制性的规定,但最好能表示程序的作用,或者与其中的主要类的名字保持一致。

程序中,由/*及*/所包含的一段是程序的注释。

另外,由//直到行尾的部分也是注释。

下面针对该程序的几个方面进行讲解。

1.名字空间

usingSystem表示导入名字空间。

高级语言总是依赖于许多系统预定义的元素,在C#中使用usingSystem表示导入系统已定义好的名字空间,这方便以后的使用。

下文要用到的Console的全称是System.Console;当程序的前面使用了usingSystem后,使用System.Console的地方就可以简写为Console。

在一定意义上,using大致相当于C/C++中的#include或者java语言中的import。

2.类和类的方法

C#是面向对象的语言,在进行编程的主要任务就是要定义类及类的方法。

程序中,用关键字class来声明一个新的类,其类名为HelloWorld。

整个类定义由大括号{}括起来。

在类的定义中,一个主要任务是定义方法。

方法相当于函数,但它必须位于类的定义之中。

在该类中定义了一个Main()方法,其中public表示访问权限,指明所有的类都可以使用这一方法;static指明该方法是一个静态方法,这种方法不用创建对象实例即可调用;void则指明Main()方法不返回任何值。

3.程序的入口

一个应用程序都有一个程序入口,程序的执行就从这里开始。

在C#中是用Main()方法为表示程序入口的。

值得注意的是,作为程序入口的Main()方法必须是static方法。

Main方法可以不为public,可以不带参数,返回值可以为void或int,所以Main()方法有多种形式。

另外,要注意Main的首字母大写。

Main()方法定义中,可以在括号()中的加入string[]args,表示是传递给Main()方法的参数,参数名为args。

publicstaticvoidMain(string[]args)

在C#中这个参数可以没有,正如前面的程序中所示。

4.程序的输入和输出

在Main()方法的实现(大括号中),只有一条语句:

Console.WriteLine("HelloWorld!

");

它用来实现字符串的输出,这条语句实现与C语言中的printf语句和C++中cout<<语句相同的功能。

另外,//后的内容为注释。

程序所完成的输入输出功能都是通过Console来完成的。

Console是在名字空间System中定义的类,它表示控制台输入输出设备,一般指键盘和显示器。

Console类有两个最基本的方法WriteLine和ReadLine,Console.ReadLine表示接受输入设备输入,Console.WriteLine则用于在输出设备上输出。

另外,Console中用于输入输出的另两个方法Rea

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 工作计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1