首页 > 编程 > C# > 正文

C#语言的版本及其功能

2023-05-20 20:23:37
字体:
来源:转载
供稿:网友

Visual C# 随.NET的开发工具Visual Studio一起推出,有如下几个版本:

1.0——随Visual Studio .NET(2002)于2002年2月13日发布。

1.5——随Visual Studio .NET 2003于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月发布。

3.0版的规范见Visual Studio 2008安装目录中的Word文档:“C:/Program Files/Microsoft Visual Studio 9.0/VC#/Specifications/2052/CSharp Language Specification.doc”。

下面罗列Visual C# 的各个主要版本的新增的特点和功能。

1)C# 1.0——与C和C++比较,C# 在许多方面有所限制和增强,包括:

 指针——C# 是真正支持指针,但是其指针只能在非安全作用域中使用,而只有具有适当权限的程序,才可以执行标记为非安全的代码。绝大多数对象的访问是通过安全的引用(references)来进行的,而引用是不会造成无效的,而且大多数算法都是要进行溢出检查的。一个非安全指针,不仅可以指向值类型,还可以指向子类和System.Object。也可以使用指针(System.IntPtr)来编写安全代码。

托管(managed受控)——在C# 中,托管内存不能显式释放,取而代之的是(当再没有内存的引用存在时的)垃圾收集。但是,引用非托管资源的对象,例如HBRUSH,是可以通过标准的IDisposable接口的指示来释放指定内存的。

多重继承——在C# 中多重继承被禁止(尽管一个类可以实现任意数目的接口,这点似Java),这样做的目的是为了避免复杂性和“依存地狱”,也是为了简化对CLI的结构需求。

转换——C# 比C++更类型安全,唯一的默认隐式转换也是安全转换,例如加宽整数和从一个派生类型转换到一个基类(这是在JIT编译期间间接强制进行的)。在布尔和整数之间、枚举和整数之间都不存在隐式转换,而且任何用户定义的隐式转换,都必须显式地标出。

数组声明——和C/C++的数组声明的语法不同,C# 中用“int[] a = new int[5];”代替了C/C++的“int a[5];”。

枚举——C# 中的枚举被放入它们自己的命名空间。

特性——可在C# 中可以使用特性(properties,属性集),访问类似于C++中成员域,与VB相似。

类型反射与发现——在C# 中可以使用完整的类型反射与发现,这些都会用到元数据所提供的信息。

模板——为了简单性,C# 1.0中不支持模板等泛型编程技术。

2)C# 1.5版的新增功能——/** */ 文档注释符、#line hidden预处理指令、/nowarn和/nostdlib编译指令、Web窗体、XML Web服务、ADO.NET、可用Windows窗体和框架创建分布式应用程序的表示层、可创建各种Windows和ASP.NET Web应用程序和控件的项目模板、可使用非可视组件和相关功能,将消息队列、事件日志和性能计时器等资源合并到应用程序中、通过组件设计器和框架类为创建组件提供RAD支持。

3)C# 2.0的新特征:

部分类——一个类可分开到多个文件中实现。

泛型——C# 从2.0起,开始支持泛型或参数类型。C# 还支持一些C++模板不支持的特性,例如对泛型参数的类型约束。另一方面,C# 的表达式不能用作泛型参数,而这在C++中却是允许的。C# 的参数化的类型为虚拟机的首个类对象,允许优化和保存类型信息,这一点与Java不同。

关键字yield——迭代器的一种新形式,可通过功能类型的关键字yield,来使用协同例程。

匿名委托——提供了闭包功能。

结合运算符??——返回表中的第一个非空值,例如:

object nullObj = null;
        object obj = new Object();
        return nullObj ?? obj // returns obj;

可空值类型——可空值类型由问号?来标记(例如,int? i = null;),它可以改善与SQL数据库的交互。

4)C# 3.0的新特征:

LINQ(Language Integrated Query,语言集成查询)——"from, where, select"上下文敏感的关键字,允许在SQL、XML、集合等之间进行查询。

对象初始化——如Customer c = new Customer(); c.Name = "James"; 可被写成Customer c = new Customer { Name="James" };。

集合初始化——如MyList list = new MyList(); list.Add(1); list.Add(2); 可被写成MyList list = new MyList { 1, 2 };。

 匿名类型——如var x = new { Name = "James" };。

局部变量类型推论——如var x = "hello";等价于string x = "hello"; 该特性在匿名类型变量的声明中需要。

隐含类型的数组——数组的类型现在可以省略,所以int[] arr = new int[] { 1, 2, 3 }; 现在可以写成var arr = new[] { 1, 2, 3 };。

λ表达式——如listOfFoo.Where(delegate(Foo x) { return x.Size > 10; }) 可被写成 listOfFoo.Where(x => x.Size > 10);。

编译器推断——翻译λ表达式到强类型函数或强类型表达式树。

自动属性——编译器会自动生成一个私有实例变量,而且给出适当的获取器和设置器代码,例如public string Name { get; private set; };。

扩展方法——通过在另一个静态类的一个方法的首个参数中包含this关键字,来将方法添加到类中。如

public static class IntExtensions {
              public static void PrintPlusOne(this int x) { 
                     Console.WriteLine(x + 1);
              }
         }
         int foo = 0;
         foo.PrintPlusOne();

部分方法——允许代码Generator生成方法的声明作为扩展点,如果有人在另一个部分类中实际实现它,则其只被包含在源代码编译中。

5)4.0版准备增加的新特性主要有:

动态支持——通过引进新类型dynamic来提供对动态类型延迟绑定的支持。

Office可编程性——通过添加命名和可选的参数、dynamic类型、索引属性和可选的ref修饰符,大大增强了访问(包括Office自动化API在内的)COM接口的能力。

类型等价支持——可配置应用程序的内置类型信息,以代替从PIA(Primary Interop Assembly,主互操作程序集)导入的类型信息。

协变与逆变——协变(covariance)是你能够使用更多的派生类型而不是由泛型参数指定,而协变(contravariance)则让你使用更少的派生类型。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表