C#与C++很相似,还借鉴了Java的许多特点。但是C#比C++更安全,比Java更高效,特别适合于Windows环境下的.NET编程。
眼看Java占领了利润丰厚的服务器端编程的大部分市场,微软公司心有不甘。为了与Sun公司的Java和J2EE竞争,1996年Bill Gates(比尔·盖茨)用重金从Borland公司挖来Anders Hejlsberg(Turbo Pascal和Delphi的开发者,丹麦人)。Hejlsberg转到微软公司后,先后主持开发和设计了VisualJ++(1997年)和.NET框架中的CLI、C#语言(2000年)。
C#语言源自C++,C#的很多内容都与Java相似,如虚拟机、垃圾内存收集、接口、GUI支持。与Java不同的是C#保留了指针,不过限制了指针的使用。C#还引入了值类型、引用类型、元数据、装箱和拆箱转换等概念。
C#是一种面向对象的程序设计语言,最初是作为.NET的一部分而开发的。换句话说,.NET是围绕C#而开发的。C#面向过程和对象的语法是基于C++的,也包含了另外几种程序设计语言的特征(其中最显著的是Delphi、Visual Basic和Java)。C#特别强调简易性,如所需符号比C++的少、所需修饰比Java的少。
从某种意义上来说,C#是最直接地反映了底层CLI的一种程序设计语言,它非常依赖于.NET框架,因为它被特意设计成能充分利用CLI所提供特征的一种语言。例如,绝大多数的C#内置类型都对应于CLI框架所实现的值类型。
用C#编写的应用程序,需要CLR的一个实现才能运行。这与Java的虚拟机JVM有点相似,但是与Java不同的是,CLI应用程序要被编译两遍:第一遍由C#编译器将C#源程序编译成平台抽象字节码,即IL(Intermediate Language,中间语言)代码,存放在PE(Portable Executable,可移植可执行)文件中(似Java的.class);第二遍在应用程序首次运行时,由CLR的JIT编译器,将IL代码编译成本地客户端的机器代码。
VisualC#1.0是随.NET框架1.0和Visual Studio.NET2002一起推出的;VisualC#1.1是随.NET框架1.1和Visual Studio.NET 2003一起推出的;Visual C#2.0是随.NET框架2.0和Visual Studio 2005一起推出的;Visual C#3.0是随.NET框架3.5和Visual Studio 2008一起推出的。
C#语言已于2001年12月成为欧洲标准:ECMA-334 C#Language Specification(C#语言规范),2002年12月、2005年6月和2006年6月又分别推出第2版、第3版和第4版。2003年4月,C#成为国际标准:ISO/IEC 23270:2003 Information technology—C#Language Specification(信息技术——C#语言规范),2006年9月又推出第2版ISO/IEC23270:2006。
1.C#的设计目标
(1)C#被确定为一种简单、现代、通用、面向对象的编程语言。
(2)C#语言及其实现应该为强类型检查、数组界限检查、发现使用未初始化变量、自动垃圾回收等软件工程原则提供支持。
(3)C#语言适用于分布式环境中的软件组件开发。
(4)C#语言源代码的可移植性是非常重要的,程序员的转移也同样重要,特别是对那些已经非常熟悉C和C++的程序员。
(5)C#语言支持国际化是非常重要的。
(6)C#适用于为主机和嵌入式系统编写应用程序,范围从非常大的复杂操作系统到非常小的专用功能。
(7)虽然C#应用程序致力于在内存和处理能力需求上的经济性,但是该语言并不想与C语言或汇编语言在性能和大小方面进行直接竞争。
2.C#的特点
(1)简单:相对于复杂的C++,C#语言简单、开发高效。例如,在安全上下文中,C#没有指针,不允许直接存取内存。用统一的“.”操作符代替了C++中的“::”、“.”和“→”操作符。使用统一的类型系统,抛弃了C++的多变类型系统(如int的字节数、0/1转布尔值等)。
(2)现代:很大程度上由.NET框架体现,如支持组件编程、泛型编程、分布式计算、XML处理和B/S应用等。
(3)面向对象:C#全面支持面向对象的功能。与C++相比,C#没有全局变量和全局函数等,所有的代码都必须封装在类中(甚至包括入口函数Main方法),不能重写非虚拟的方法,增加了访问修饰符internal,不支持多重类继承(似Java,用多重接口实现来代替)。
(4)类型安全:C#实施严格类型安全,如取消了不安全的类型转换,不允许使用未初始化的变量,进行边界检查(如不让数组越界)。
3.C#的优势
用C#进行托管代码编程,具有如下优势:完全面向对象的设计,非常强的类型安全,很好地融合了VB和C++的强大功能,垃圾内存回收,类似于C++的语法和关键字,用委托取代函数指针增强了类型安全,为程序员提供版本处理技术解决老版本的程序不能在新DLL下运行的“动态链接库地狱”(DLL Hell)问题。
4.C#的版本与功能
VisualC#随.NET的开发工具Visual Studio一起推出,有如下几个版本:
1.0版随Visua lStudio.NET2002于2002年2月13日发布。
1.5版随Visual Studio.NET2003于2003年5月20日发布。
2.0版随Visual Studio 2005于2005年11月7日发布。
3.0版随Visual Studio 2008于2007年11月16日发布。
4.0版随Visual Studio 2010于2010年3月发布。
下面罗列Visual C#的各个主要版本的新增特点和功能。
(1)C#1.0:与C和C++比较,C#在许多方面有所限制和增强,包括:
1)指针:C#真正支持指针,但是其指针只能在非安全作用域中使用,而只有具有适当权限的程序,才可以执行标记为非安全的代码。绝大多数对象的访问是通过安全的引用来进行的,而引用是不会造成无效的,而且大多数算法都是要进行溢出检查的。一个非安全指针不仅可以指向值类型,还可以指向子类和System.Object。
2)托管:在C#中,托管内存不能显式释放,取而代之的是(当再没有内存的引用存在时)垃圾收集。但是,引用非托管资源的对象,如HBRUSH,是可以通过标准的IDisposable接口的指示来释放指定内存的。(www.xing528.com)
3)多重继承:在C#中多重继承被禁止(尽管一个类可以实现任意数目的接口,这点似Java),这样做的目的是为了避免复杂性和依存地狱,也是为了简化对CLI的结构需求。
4)转换:C#比C++更类型安全,唯一的默认隐式转换也是安全转换。例如,加宽整数和从一个派生类型转换到一个基类(这是在JIT编译期间间接强制进行的)。在布尔和整数之间、枚举和整数之间都不存在隐式转换,而且任何用户定义的隐式转换都必须显式地标出。
5)数组声明:和C/C++的数组声明的语法不同,C#中用“int[]a=newint[5];”代替了C/C++的“inta[5];”。
6)枚举:C#中的枚举被放入它们自己的命名空间。
7)特性:可在C#中使用特性(properties,属性集)访问类似于C++中成员域,与VB相似。
8)类型反射与发现:在C#中可以使用完整的类型反射与发现,这些都会用到元数据所提供的信息。
9)模板:为了简单性,C#1.0中不支持模板等泛型编程技术。
(2)C#1.5版的新增功能:/***/文档注释符、#line hidden预处理指令、/nowarn和/nostdlib编译指令、Web窗体、XMLWeb服务、ADO.NET、可用Windows窗体和框架创建分布式应用程序的表示层、可创建各种Windows和ASP.NET Web应用程序和控件的项目模板、可使用非可视组件和相关功能将消息队列、事件日志和性能计时器等资源合并到应用程序中、通过组件设计器和框架类为创建组件提供RAD支持。
(3)C#2.0的新特征:
1)部分类:一个类可分开到多个文件中实现。
2)泛型:C#从2.0起,开始支持泛型或参数类型。C#还支持一些C++模板不支持的特性,例如对泛型参数的类型约束。另一方面,C#的表达式不能用做泛型参数,而这在C++中却是允许的。C#的参数化的类型为虚拟机的首个类对象,允许优化和保存类型信息,这一点与Java不同。
3)关键字yield:迭代器的一种新形式,可通过功能类型的关键字yield来使用协同例程。
4)匿名委托:提供了闭包功能。
5)结合运算符:返回表中的第一个非空值,例如:
6)可空值类型——可空值类型由问号“?”来标记(例如,int?i=null;),它可以改善与SQL数据库的交互。
(4)C#3.0的新特征:
1)LINQ(Language Integrated Query,语言集成查询)——"from,where,select"上下文敏感的关键字,允许在SQL、XML、集合等之间进行查询。
2)对象初始化——如Customerc=new Customer();c.Name="James";可被写成Customer c=new Customer{Name="James"};。
3)集合初始化——如MyListlist=new MyList();list.Add(1);list.Add(2);可被写成MyList list=new MyList{1,2};。
4)匿名类型——如varx=new{Name="James"};。
5)局部变量类型推论——如varx="hello";等价于stringx="hello";,该特性在匿名类型变量的声明中需要。
6)隐含类型的数组——数组的类型现在可以省略,所以int[]arr=new int[]{1,2,3};现在可以写成vararr=new[]{1,2,3};。
7)λ表达式——如listOfFoo.Where(delegate(Foox){return x.Size>10;})可被写成listOfFoo.Where(x=>x.Size>10);。
8)编译器推断——翻译λ表达式到强类型函数或强类型表达式树。
9)自动属性——编译器会自动生成一个私有实例变量,而且给出适当的获取器和设置器代码,例如public string Name{get;privateset;};。
10)扩展方法——通过在另一个静态类的一个方法的首个参数中包含this关键字,来将方法添加到类中。如
11)部分方法——允许代码生成器生成方法的声明作为扩展点,如果有人在另一个部分类中实际实现它,则其只被包含在源代码编译中。
(5)4.0版增加的新特性:
1)动态支持——通过引进新类型Dynamic来提供对动态类型延迟绑定的支持。
2)Office可编程性——通过添加命名和可选的参数、Dynamic类型、索引属性和可选的ref修饰符,大大增强了访问COM接口(包括Office自动化API在内)的能力。
3)类型等价支持——可配置应用程序的内置类型信息,以代替从PIA(Primary Interop Assembly,主互操作程序集)导入的类型信息。
4)协变与逆变——协变是你能够使用更多的派生类型而不是由泛型参数指定,协变让你使用更少的派生类型。
C#与C++很相似,还借鉴了Java的许多特点。但是C#比C++更安全,比Java更高效,特别适合于Windows环境下的.NET编程。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。