17C#语言.docx
- 文档编号:8176568
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:70
- 大小:410.67KB
17C#语言.docx
《17C#语言.docx》由会员分享,可在线阅读,更多相关《17C#语言.docx(70页珍藏版)》请在冰豆网上搜索。
17C#语言
第17章C#语言简介
C#(CSharp)是微软于2000年提出的一种源于C++、类似于Java的面向对象编程语言,适合于分布式环境中的组件开发。
C#是专门为.NET设计的,也是.NET编程的首选语言。
C#语言的相关帮助文档位于MSND的“帮助查看器主页\VisualStudio2010\VisualStudio\VisualStudio语言\VisualBasic和VisualC#\VisualC#”目录中。
17.1OOP语言
OOP(Object-OrientedProgramming,面向对象编程)是目前主流的编程技术,本节介绍其中最重要的C++、Java和C#,重点是它们三者之间的关系与对比。
17.1.1OOP概述
程序设计语言,在思想上发展很快,在技术上也是不断创新。
经历了手工操作(控制面板)、机器语言、汇编语言、宏汇编语言、高级语言和第4代语言等多个阶段。
OOP只是在高级程序设计语言中,流行的多种编程技术之一。
1.基本特征
面向对象编程的三个基本特征是:
●封装(encapsulation)——是对问题的抽象,以达到信息隐藏的目的。
通过类和对象,将属性(数据/变量)和方法(操作/函数)封装在一个黑箱内,将细节隐藏起来。
既可以保护数据不被他人恶意或大意地修改,又能防止其他程序员编写高耦合度的代码,还方便了今后对对象内部的修改和升级。
●继承(inheritance)——利用问题和事物的相似性,通过类的(多层)继承机制,可以达到减少软件开发难度和重用已有对象的属性和方法之目的。
●多态(polymorphism)——同一操作或响应,可以同时针对多个可选的类型和对象,并且能够自动在它们中间选择最合适的来进行。
多态可以分为:
⏹编译时多态:
包括函数和运算符的重载(overload),通过早期的静态绑定(binding)来实现。
⏹运行时多态:
通过继承结合晚期动态绑定来实现——用同一基类的指针,可以访问各个不同派生类中的同名方法和函数。
2.基本概念
面向对象编程的基本概念(类似的概念多、表达不够准确、各处的用法各异):
●抽象(abstraction)——一个问题的本质特征。
忽略一个对象的细节,致力于一般的合适级别的程序能力。
抽象是在事物的周围绘制透明的盒子,是定义事物接口的行为。
●信息隐藏(informationhiding)——限制外部对类属性(数据成员)的访问。
●封装(encapsulation)——将某种保密和隐匿应用到类中的数据和一些方法(函数或子例程)上。
封装确保一个对象只能通过确定的渠道(即类的公用方法)才可被修改。
封装意味着将数据及相关函数打包到一个单一的单元(类)中。
每个对象暴露一个接口(公用方法),规定其他对象可以如何读取或修改它。
●类(class)——问题的抽象,对象的模版,接口的实现。
例如int是整数的模版、CPoint是点的模版。
●对象(object)——问题中的事物,类的实例(变量),拥有数据和功能。
若inti;CPointp;则i是int的实例变量,p是CPoint的实例对象。
●实例(instance)——一个对象,是某个类的示例。
●实例化(intantiate)——由类定义创建对象。
●继承(inheritance)——创建子类的机制,一种“isa”或“islike”关系,形成类层次结构。
是OOP中对象重用的核心概念。
●子类(subclass)——继承自另一个类的派生类(derivedclass)。
●超类(superclass父类)——被另一个类继承的基类(baseclass)。
●虚函数(virtualfunction)——可以在子类中被覆盖(override)的函数。
●纯虚函数(purevirtualfunction)——只有声明没有定义的函数,必须在派生类中被覆盖。
●抽象类(abstractclass)——至少包含一个纯虚函数的类,不能被实例化。
●具体类(concreteclass)——可以实例化的类,不包含纯虚函数。
●接口(interface)——纯抽象的类,类的模版。
接口中的所有的方法(成员函数)都只有声明,没有定义(都是纯虚函数)。
必须在接口的派生类中,实现接口的全部方法。
接口可以看成是一个,定义了一套内部行为的,若干操作特征标记的集合。
(在C++中,也把类的公用成员函数叫做接口)。
●属性(attribute)——类和接口中的数据信息,又叫数据成员(datamember)或成员变量(membervariable)。
属性是类知道的事物。
●方法(method)——类操作的实现,又叫成员函数(memberfunction)。
方法是类要做的事情。
(在C++中,也把虚函数叫做方法)。
●重载(overload)——一个类中的,参数的数目、类型或排列顺序不同的多个同名方法(成员函数)。
●覆盖(override)——在子类中重新定义(与父类中的定义有区别的)属性和方法。
●持久化(persistence)——将对象存入永久存储中(如文件、数据库等)。
●持久对象(persistentobject)——存入永久存储的对象。
3.简史
计算机科学中,对象的概念和实例,最早于1960年出现在MIT的PDP-1中,1963年IvanSutherland在其博士论文中所编写的计算机程序Sketchpad中应用了对象技术。
但是,作为一种程序设计方法,OOP最早出现在1967年,由挪威计算中心的Ole-JohanDahl和KristenNygaard,在他们发明的Simula67语言中首先引入的。
Simula语言是在Algol60基础上,加入了对象、类和继承等概念后开发出来的,它在OOP的历史中占有重要地位。
Smalltalk是1970年代,由美国施乐(Xerox)公司PARC(PaloAltoResearchCenter帕洛阿尔托研究中心)的AlanKay、DanIngalls、TedKaehler和AdeleGoldberg等人,开发的一种面向对象和动态类型的交互式程序设计语言。
它受到了Sketchpad和Simula的影响,但是Smalltalk被设计成一个全动态系统的纯OOP,程序的所有成分都是对象(但是,为了提高运行效率,C++/Java/C#中的基本数据类型都不是对象),对象可以被动态地创建、修改和销毁。
在Smalltalk中还创造出词汇“'inheritance(继承)”和“Object-orientedprogramming(面向对象的程序设计)”。
使OOP走向辉煌的是1985年发明的C++,随着GUI(GraphicalUserInterfaces,图形用户界面)的流行,C++的地位更加巩固。
但是,因特网的发展和万维网的流行,又催生了另一个重要的OOP语言——Java(1995年)。
为了与Sun公司的Java竞争,微软公司也推出了一种用于.NET组件编程环境的新OOP语言——C#(2000)。
4.语言谱系图
C语言系列的发展简图如图17-1所示。
C语言是专门为编写操作系统而发明的,是一种面向系统编程的中级语言。
C++是带类的C,是为面向对象编程而设计的。
Java最初是为嵌入式设备创建的,后来改造成适用于跨平台的网络编程。
C#则是专门为面向组件编程的.NET而设计的一种源于C++、类似于Java的OOP语言。
图17-1C语言系列
图17-2给出了可用于.NET编程的主要高级语言(包括C#、VB、C++/CLI、J#和F#等)的发展脉络。
17.1.2C++
C++是第一个广泛流行的OOP语言,C++是在C语言的基础上,添加了面向对象和泛型编程的功能后,扩展而成的。
C语言是C++的子集,C++是C语言的超集。
1.C
C语言是为编写操作系统而创建的一门高级语言,语法简洁、表达自由、库函数丰富,具有强大的功能和极大的灵活性,适用于高效的系统编程。
KenThompson(左)与DennisRitchie(右)
1)起源
1970年,AT&T贝尔实验室的美国计算机科学家KenThompson和DennisRitchie等人在DEC公司的PDP-7小型机上开发出了Unix操作系统,最初的实现是用汇编语言写成的。
为了使Unix操作系统具有可移植性,迫切需要一种高级语言工具。
为此,DennisRitchie以B语言为基础,参考了Algol68,于1972年设计出了C语言。
1973年他们用C语言重写了Unix,1975年又利用C语言将Unix移植到了PDP-11上。
图17-2主要编程语言工具的发展
2)特点
C语言是一种可移植的系统语言,拥有充分的控制语句和数据结构功能,包含丰富的操作符,从而能够提供强大的表达能力,可以用于许多不同的应用领域。
但是,C语言并不是面向科学家和计算机业余爱好者的,而是专门为程序员设计的。
为了进行高效的系统编程,C语言提供了强大的功能和极大的灵活性。
与其它高级语言相比,C语言的语法简洁、表达自由、库函数丰富。
如果将编程比作造房子,则Fortran和Basic等语言就像一些已经预先造好的大预制件,使用起来简单快捷,但是灵活性差、且功能有限,只能造某些固定模式的房屋;而C语言就像一块块的小砖,使用起来虽然繁琐,但是灵活性强、而且功能无限,能够造各式各样的建筑物,不过这就要求C语言程序员具有很高的专业水平。
因此,C语言假设使用者都是计算机专家,采取的是程序员负责制。
它不进行完备的类型检查,对数组越界也没有限制。
为了进行高效的系统编程,C语言还提供了指针和指针运算,程序员可以随意操作全部内存,任意修改任何内容。
表达的自由性和操作的任意性,也给C语言带来了很多编程问题和安全隐患。
特别是C语言的++/--运算符和指针运算,更是倍受指责。
与其它高级语言相比,C语言提供了一些低级语言特征,更面向机器。
所以,也有人称C语言是介于高级语言和低级语言之间的一种中级语言。
3)标准
(1)K&RC
开始的很多年,C语言没有国际标准,只有一个事实标准——1978年BrianKemighan和DennisRitchie编写的《C程序设计语言》(TheCProgrammingLanguage)一书,通常称其为K&RC或经典C。
该书的附录“C参考手册”(CReferenceManual)成为了C语言的实现指南,但是书中缺少对库函数标准的描述,一般以Unix实现的库函数所为事实标准。
需要说明的是,因为C语言的语法成分简单,很多基本功能(例如I/O语句)都是靠库函数来实现的。
所以,C语言比其它高级语言更依赖于库函数。
(2)C90
1983年ANSI(AmericanNationalStandardsInstitute美国国家标准协会)设立了一个X3J11小组,着手进行C语言的标准化。
并最终于1989年推出ANSIC(ANSIX3.159-1989),1990年它又成为国际标准ISOC(ISO/IEC9899:
1990Programminglanguages–C,程序设计语言——C),原来叫做ANSIC或ISOC,现在通常称其为C89或C90。
C90对K&RC的主要改变是,增加了函数原型(prototype),强调对函数的输入参数进行严格的类型检查;允许将结构本身作为参数传递给函数(原来只允许传地址);并补充定义了C语言的标准函数库。
增加了关键字:
const(常型变量)、enum(枚举类型)、signed(有符号的,例如signedchar)、void(空/无,可用于函数返回值和形参、通用指针类型)、volatile(易变变量,防止编译器错误的优化)等。
还增加了预处理指令:
#elif(elseif)、#error(错误,强制编译停止)、#line(修改当前行号和源文件名)、#pragma(附注/编译指令,编译器定义的与实现有关的指令)。
(3)C99
对C90的修订工作开始于1994年,在ISOC++(1998)标准推出之后,ISO又于1999年12月16日,推出了C语言标准的第2版:
ISO/IEC9899:
1999Programminglanguages–C(程序设计语言——C),一般称其为C99。
C99主要的修订目标有三点:
①支持国际化编程,引入了支持国际字符集Unicode的数据类型和库函数;②修正原有版本的明显缺点。
如整数的移植方法,例如int8_t、int16_t、int32_t和int64_t等类型;③针对科学和工程的需要,改进计算的实用性。
例如添加了复数类型和新数学函数。
C99对C89/C90的具体修改有:
①增加了C++的//注释风格:
原来C语言只支持多行注释:
/*……*/,C99现在也识别单行注释:
//……。
②增加了关键字:
inline(内联函数)、restrict(限制)、_Bool(布尔类型)、_Complex(复数)、_Imaginary(虚数)。
③增加了数据类型:
(unsigned)longlong[int](64位整数)(对应的打印输出格式为%lld或%llu)。
④定义了可移植整数类型,如:
int8_t、int16_t、int32_t、int64_t,uint8_t、uint16_t、uint32_t、uint64_t;intptr_t、uintptr_t。
以及表示对应类型常量的方法,如INT8_C(128)、INT32_C(1234)。
⑤增加了浮点常量的十六进制格式:
p或P表示后跟二进制指数(的十进制值)。
例如:
0xa.1cp10=(10+1/16+12/256)*210=10352.0。
⑥增加了浮点数的十六进制打印格式符:
%a或%A(代替十进制的%e或%E)、%La或%LA(代替十进制的%Le或%LE)。
⑦可指定初始化的条目(未被初始化的条目全被置为0),如:
intdays[12]={31,28,[4]=31,30,31,[1]=29};⑧支持变长数组(即可用变量来定义数组的大小),如:
floata[n],a2[m][n];⑨允许在代码块的任何地方定义变量(似C++)。
⑩允许在结构的最后定义一个大小可伸缩的弹性数组成员,可以用于结构指针,根据允许情况来动态分配内存。
但是,C99增加的新特性中,有许多当前的C++标准还不支持。
2.C++起源
作为结构化的面向过程的编程语言,C已经是非常优秀的了,它简单、高效、灵活、功能强大。
但是,随着软件开发的规模越来越大,所针对的问题和系统越来越复杂,对软件维护和重用的需求越来越高。
仅仅靠面向过程的编程技术,就显得有点力不从心了。
因此,针对问题的面向对象编程技术,就应运而生。
BjarneStroustrup
1985年,贝尔实验室的计算机科学家,丹麦人BjarneStroustrup在Simula67的启发下,对C语言进行了扩充,在保留C语言优点的基础上,添加了面向对象的特征和功能后,将C语言扩展成为带类的C(CwithClasses),1983年RickMascitti将其命名为C++。
1985年10月BjarneStroustrup实现了C++的第一个商用版本,与此同时他还出版了《TheC++ProgrammingLanguage(C++程序设计语言)》的第1版,成为C++的事实标准。
C++的第1版,提供了面向对象程序设计的基本特征:
类和对象、单继承、虚函数、公有/私有成员的访问控制、函数重载等。
1989年推出C++的第2版,增加了多继承、抽象类、静态和常型成员函数、保护成员的访问控制、运算符重载等新特性,促使C++语言流行起来。
1990年1月1日MargaretA.Ellis和BjarneStroustrup出版了《TheAnnotatedC++ReferenceManual(带注释的C++参考手册)》。
1991年BjarneStroustrup推出了《C++程序设计语言》的第2版:
TheC++ProgrammingLanguage(2ndedition)。
1993年推出C++的第3版,增加了模板、异常处理和嵌套类等新特性.1994年3月29日BjarneStroustrup出版了《TheDesignandEvolutionofC++(C++的设计和演化)》。
1997年BjarneStroustrup推出了《C++程序设计语言》的第3版:
TheC++ProgrammingLanguage(3rdedition)。
3.C++标准
1994年7月,ANSI/ISOC++标准委员会,通过了AlexanderStepanov提出的泛型编程方案STL(StandardTemplateLibrary,标准模板库)。
1998年9月1日C++成为国际标准(ISO/IEC14882:
1998Programminglanguages--C++,程序设计语言——C++),添加的新特性主要有:
命名空间、新的强制类型转换、布尔类型和STL。
2000年2月15日BjarneStroustrup推出了《C++程序设计语言》的特别版:
TheC++ProgrammingLanguage(SpecialEdition)。
2003年10月15日ISO推出了C++标准的第2版ISO/IEC14882:
2003,该版本在语法特征上没有什么变化,只是纠正了原版的各种错误,并进行了一些技术上的修订。
2007年11月15日ISO又推出了C++的扩展库标准(TR1,技术报告1):
ISO/IECTR19768:
2007Informationtechnology--Programminglanguages--TechnicalReportonC++LibraryExtensions。
微软公司在其VisualStudio2008SP1中的VisualC++2008功能包(FeaturePack)支持此TR1。
2010年9月3日ISO还推出了C++的支持数学特殊函数的扩展库标准:
ISO/IEC29124:
2010Informationtechnology--Programminglanguages,theirenvironmentsandsystemsoftwareinterfaces--ExtensionstotheC++Librarytosupportmathematicalspecialfunctions。
2011年8月12日ISO通过了新版C++语言标准——C++11(ISO/IEC14882:
2011Informationtechnology--Programminglanguages--C++,Edition3),它包含了几个核心语言新功能,并扩展了C++标准库,还合并了大多数TR1库(数学特殊函数库除外)。
现在的C++已经成为了一种同时具有面向过程、面向对象和泛型编程的特征,功能强大、运行高效、使用广泛的混合型程序设计语言。
4.C++11
C++11是ISO于2011年8月12日推出的C++语言新标准。
先前一直叫做C++0x,原计划在零几年推出。
从2004年2月7日起开始,陆续推出了多个工作草案,2011年4月11日推出了最终草案国际标准FDIS(FinalDraftInternationalStandard)http:
//www.open-std.org/JTC1/SC22/WG21/prot/14882fdis/n3290.pdf,2011年9月1日发布了最终标准文档(需352瑞士法郎,约合2362元人民币)。
新的C++标准大幅改善了C++内核语言领域,包括多线程支持、泛型编程、统一的初始化,以及表现的加强等。
具体的改进有:
增加了右值引用(typename&&)、扩展了常数表达式(引入新关键字constexpr)、放宽了关于POD(PlainOldData,简单旧数据)型结构的定义、引入了外部模板概念(externtemplateclass)、可将初始化列表的概念绑定到类型上(std:
:
initializer_list)、提供了一种统一语法来初始化任意对象、可进行类型推导(auto)、支持以范围为基础的for循环、允许定义λ(lambda)函数、引进了一种新的函数定义与声明的语法(template
:
基类名;)、引入了表示空指针常数的新关键字(nullptr)、引进了一种特别的枚举类(enumclass)、关键字explicit修饰符可用于显示类型转换、可用于模板类型的别名定义(template<…>usingTypedefName=SomeType<…>;)、移除了所有对union的使用限制(除了其成员仍然不能是引用类型)、加入了(允许任意个数和任意类别的模板实参的)变长参数模板、增加了两种新的字符类别char16_t(UTF-16)和char32_t(UTF-32)(传统的char类型对应于UTF-8)和新的字符串常量(u8"I'maUTF-8string."、u"ThisisaUTF-16string."、U"ThisisaUTF-32string.")、允许用户自定义新的常量修饰符(literalmodifier)、引入了支持多线程编程的多任务存储器模型和线程区域的存储期限(thread_local)、可使用或禁用对象的默认函数(default和delete)、(同C99)增加了64位的整数类型(longlongint)、增加了用于测试的静态声明(static_assert新关键字)、允许sizeof操作符作用在类的数据成员上(无须明确的对象)。
C++11标准程序库将引进了数个新功能(如线程功能、元组类型、散列表、正则表达式、通用智能[smart,灵巧]指针、可扩展随机数功能、包装引用、函数对象的多态包装、元程序的类型特性[trait]、用于计算函数对象返回类型的统一方法),其中许多可以在现行标准下实现,而另外一些则依赖于(或多或少)新的C++11内核语言机能。
新的程序库的大部分被定义于于2005年发布发TR1(LibraryTechnicalReport,库技术报告),各式TR1的完全或部分实现原提供在命名空间std:
:
tr1,现在C++11将其移置于命名空间std之下。
已被移除或是不包含在C++11标准的特色:
●预计由TechnicalReport提供支持:
模块、十进制类别、数学特殊函数。
●延后讨论:
概念(Concepts)、更完整或必备的垃圾回收支持、反射(Reflection)、宏域(MacroScopes)。
●将被移除或废弃的特色:
循序点(sequencepoint)、导出(export)、动态异常规范(dynamicexceptionspecifications)、std:
:
auto_ptr(被std:
:
unique_ptr取代)、函数对象基类(std:
:
unary_function,std:
:
binary
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 17 C# 语言
![提示](https://static.bdocx.com/images/bang_tan.gif)