`
lovnet
  • 浏览: 6670445 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Visual C# .NET 2003 语言的改变

阅读更多
<!--- end left ---><!--- start main --->Visual C# .NET 2003 语言的改变
Prashant Sridharan
Microsoft Corporation
2002年12月30日

适用于:
Microsoft Visual Studio® C# 2003

摘要:为了与欧洲计算机制造商协会 (ECMA) 的 C# 规范完全兼容,Microsoft Corporation 对 C# 编译器的实现进行了几处改动。这些改动将在多方面影响现有的代码,因此用户必须检查他们的代码以确保这些代码符合 C# 编程语言必需的和推荐的使用要求。

目录

背景

2001 年年底,ECMA 将 C# 编程语言批准为一项标准 (ECMA-334)。为了与 Microsoft 在 C# 和公共语言接口 (CLI) 标准化进程方面的举措保持一致,Microsoft 遵循 ECMA C# 标准的精神和文字规范对 C# 编译器进行了几处小的改动。另外,Microsoft 在遵循 C# 标准规范的同时对 C# 实现作了一些额外的小改动,并更正了 C# 程序员遇到的一些编译器问题和错误。其中的每处改动都可能导致使用 Visual C# .NET 2002 版编译器编写的代码在用于 Visual C# .NET 2003 之前必须进行修改。

C# 语言的新功能

Visual C# .NET 2003 版的 C# 语言中添加了两个新功能。第一,编译器现在支持 #line hidden 预处理器指令。#line hidden 指令主要用于源代码生成器,它通知编译器忽略紧跟在 #line hidden 指令后面的所有代码行的调试程序信息,直到遇到下一个 #line 指令为止(该 #line 指令的调试程序信息也一并被忽略),这里假设它们中间不会立即碰到下一个 #line hidden 预处理指令。在下面的示例中,编译器生成了 IL 代码,其中的 WriteLine 语句不包含调试信息。这样,调试应用程序的程序员将无法查看“隐藏”的代码并检查其中的内容:

public class Customer
{
   public static void Main()
   {
      MyClass c = new MyClass();

      c.ExecuteCommand();

      #line hidden
      Console.WriteLine("显示一些文字");
      Console.WriteLine("显示一些文字");
      Console.WriteLine("显示一些文字");
      #line

      c.ProcessCommand();

      c.Close();
   }
}

然而,#line hidden 指令并不隐藏编译器错误。当然,编译器仍然将代码编译到 IL 中,且代码仍旧执行;编译器只是禁止调试程序进入它的内容。

第二个 C# 新功能涉及 XML 注释,是根据 ECMA 标准添加的。C# 现在支持在使用“斜线和星号”符号(/**/)编写的多行注释中添加 XML 注释。下面的 XML 注释在 2003 版的 C# 编译器中是合法的:

/**
<summary>这是
注释

</summary>
*/

此外,出于完整性的考虑(但实际上绝不推荐),程序员可以混合并匹配注释样式,同时仍然能够编写出有效的 XML 注释代码。这样,下面的这个注释声明现在也是合法的:

/**
<summary>这是
注释
*/
/// </summary>

实现的改变

2003 版的 C# 编译器和 2002 版也有微小的区别。在有些情况下,这些区别可能会导致代码无法编译,或导致其运行方式与应执行的方式大相径庭。

“Foreach”语句的改变

现在,foreach 语句可以动态地检查它所迭代的数据结构中是否存在 IDisposable 接口。以前,编译器从不动态地检查 Idisposable 接口是否存在,除非从 GetEnumerator 返回的类型已实现了 IEnumerator 接口。然而,如果此类型对于实现 Idisposable 是静态已知的,则编译器将一直调用 Dispose。换句话说,如果迭代程序类型实现了枚举器设计模式,但没有专门实现 IEnumerator 接口,编译器就不会调用 Dispose 方法,除非 iterator 类型对于实现 IDisposable 接口是静态已知的。

现在,编译器在检测是否存在 IDisposable 接口时,无论迭代程序类型是否实现 IEnumerator,都将调用 Dispose 方法(如果已实现)。在下面的示例中,Visual C# .NET 2002 编译器未调用 Dispose 方法,但 Visual C# .NET 2003 编译器调用了该方法:

abstract class Base
{
   public int Current { get; }
   public bool MoveNext();
}

class Derived: Base, IDisposable
{
   // Base 和 IDisposable 的实现
}

class MyClass
{
   public Base GetEnumerator()
   {
      return new Derived();
   }
}

foreach 语句在某个对象集合中使用迭代时,它将执行 GetEnumerator 方法并接收转换为 Base 类型的 Derived 实例作为它的迭代程序类型。当然,Base 类型无需为了调用它的 CurrentMoveNext 方法而实现 Ienumerator 接口。在早期编译器中,Derived 类型的 Dispose 方法不被调用,因为它不实现 IEnumerator,并且类 Base 对于实现 Idisposable 不是静态已知的。在新的编译器中,Dispose 方法被调用,因为编译器在所有 foreach 语句的迭代程序类型中检查是否存在 Idisposable 接口。由于 GetEnumerator 调用的结果是一个转换为 Base 类型的 Derived 类型,并且由于 Derived 类型实现 Idisposable 接口,因此编译器动态检查 Idisposable 接口是否存在,会导致对 Dispose 方法的调用。

属性声明的改变

ECMA C# 标准明确禁止为相应的属性创建获取和设置函数。实际上,C# 编译器将属性声明转换为获取和设置函数,以便不支持属性的语言也可以访问数据。因此,下面的代码是无效的,因为编译器会产生 get_Propset_Prop 方法,而这两个方法与用户声明的方法发生冲突:

public class MyClass
{
   public int Prop
   {
      get
      {
      }

      set
      {
      }
   }

   // 现在属于非法函数
   public int get_Prop()
   {
   }

   // 现在属于非法函数
   public void set_Prop(int val)
   {
   }
}

以前,C# 编译器允许创建此类函数,显然这是一个软件错误。2003 版的 C# 编译器纠正了这个错误。

作为此编译器错误纠正的必然结果,C# 编译器将不再允许显式创建生成属性的获取和设置函数(如果将属性定义为接口实现的结果)。在下面的示例中,2003 版的 C# 编译器不再允许在 Derived 类中显式实现 IMyInterface.get_PropIMyInterface.set_Prop 方法:

interface IMyInterface
{
   public int Prop { get; set; }
}

public class Derived : IMyInterface
{
   public int Prop
   {
      get
      {
      }

      set
      {
      }
   }

   // 非法
   public int IMyInterface.get_Prop()
   {
   }

   // 非法
   public void IMyInterface.set_Prop(int val)
   {
   }
}

其他改变

C# 编译器的早期版本允许不兼容地使用属性。2003 版的 C# 编译器已经纠正了这些用法,因此更符合 ECMA 规范。首先是对 C# 编译器进行了纠正,不允许在其参数列表中使用未在属性类声明中声明为 public 的命名参数。例如,如果某个 AuthorAttribute 类是使用名为 authorName 的私有字段创建的,则下面的语句在 C# 编译器的早期版本中是允许的,但在 C# 2003 编译器中却会导致错误:

[Author(authorName="microsoftuser")]
public class MyClass
{
}

第二,ObsoleteAttribute 现在可以应用到运算符,这样程序员就可以使重载的运算符函数失效。最后,编译器以前对于无法识别的属性位置常常生成一个错误,而现在则根据 ECMA C# 规范的要求只生成一个警告。

另外,C# 编译器以前接受用户定义的移位运算符参数(<< 和 >>),而根据 ECMA C# 规范,这些参数是无效的。例如,移位运算符以前可以按以下方式进行声明,即将封装类的类型声明为第二个操作数:

public class MyClass
{
   public static MyClass operator <<(int I, MyClass c) 
   {
   }
 
   public static void Main()
   {
   }
}

按照规范,如果向左移位运算符被重载,则二进制运算符的操作数列表中的第一个参数必须为封装类型。同样,如果向右移位运算符被重载,则二进制运算符的操作数列表中的第二个参数必须为封装类型。下面的代码示例演示了向左移位运算符的正确声明方式:

public class MyClass
{
   public static MyClass operator <<( MyClass c, int i) 
   {
   }
 
   public static void Main()
   {
   }
}

最后,还加入了几个用于纠正编译器错误的修复,包括:

  • 对显式赋值算法的纠正,使编译器对于符合 ECMA C# 规范的代码不再报错。
  • 枚举类型现在可以转换为字符(详见 ECMA C# 规范中的说明)。
  • 内部虚警告已被删除,因为内部虚函数无法在程序集外被重写。

小结

C# 编译器以不同的方式实现了几个功能,从而获得了比前一版更高的性能。但这些改进不会影响对代码的编译和执行:

  • 在迭代字符串的元素时,foreach 语句现在使用字符串的索引器而非枚举器模式,这样使性能更佳。
  • 现在,C# 编译器在处理浮点运算和十进制数学运算方面更严格地遵循 ECMA C# 规范。
  • 几个软件错误已被修复,使控制流得到优化。
分享到:
评论

相关推荐

    小型超市进销管理系统 开发环境是在Visual Studio .NET 2005的平台上,使用语言是C#/ASP开发基于C#.Net的应用程序,建立一个超市进销管理系统

    系统应有具有如下功能(供参考): (1)资料管理 企业经营的基础资料时一个企业的最基本最重要的信息,资料管理功能模块就是用于维护这些基础资料。...参数设置 权限设置 数据备份 日志管理 更改密码。

    C#.NET开发者指南计算机专业毕业设计外文翻译-中英文对照.docx

    C#.NET Web开发指导的重点不是教你C#语言的核心内容,而是提供代码实例来帮助你使用.NET框架类库的功能。基础类库的.NET框架集合覆盖了大量API。尽管不可能在一本书中包含所有的特征,但是本书中包含了其中的关键...

    Visual.Assist.X.v10.5.1724+Crack

    Visual Assist X是一款非常好的Microsoft Visual Studio 2005和Visual Studio .NET插件,支持C/C++,C#,ASP,Visual Basic,Java和HTML等语言,能自动识别各种关键字、系统函数、成员变量、自动给出输入提示、...

    Visual Assist X 1649 + Crack

    Visual Assist X是一款非常好的Microsoft Visual Studio 2005和Visual Studio .NET插件,支持C/C++,C#,ASP,Visual Basic,Java和HTML等语言,能自动识别各种关键字、系统函数、成员变量、自动给出输入提示、...

    visual assist 1646(xx)

    Visual Assist X是一款非常好的Microsoft Visual Studio 2005和Visual Studio .NET插件,支持C/C++,C#,ASP,Visual Basic,Java和HTML等语言,能自动识别各种关键字、系统函数、成员变量、自动给出输入提示、...

    Visual.Assist.X10.0.1246.0

    &lt;br&gt;Visual Assist X是一款非常好的Microsoft Visual Studio 2005和Visual Studio .NET插件,支持C/C++,C#,ASP,Visual Basic,Java和HTML等语言,能自动识别各种关键字、系统函数、成员变量、自动给出...

    Visual.Assist.X10.5.1727.0

    &lt;br&gt;Visual Assist X是一款非常好的Microsoft Visual Studio 2005和Visual Studio .NET插件,支持C/C++,C#,ASP,Visual Basic,Java和HTML等语言,能自动识别各种关键字、系统函数、成员变量、自动给出...

    .net技术资料大全(语言规范 源码教程 学习笔记 技术资料 .net代码生成器)

    C# Language Specification 1.2(C#语言规范1.2).doc C# Language Specification 2.0(C#语言规范2.0).doc 源码教程 ASP.NET编程技术与交互式网页设计 asp.net亲密接触_带源码 C#学习 01_类.htm.txt 02_构造函数...

    VisualAssist(破解版)VC++插件

    Visual Assist X是一款非常好的Visual Studio .NET 2003、2002插件,支持C/C++,C#,Visual Basic等语言,能自动识别各种关键字、系统函数、成员变量、自动给出输入提示、自动更正大小写错误、自动标示错误等,有...

    VisualAssistX_10.7.1912_Soft711

    Visual Assist X是一款非常好的Visual Studio .NET 2003、2002插件,支持C/C++,C#,Visual Basic等语言,能自动识别各种关键字、系统函数、成员变量、自动给出输入提示、自动更正大小写错误、自动标示错误等,有...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    visual c# 2010新增了大量可圈可点的丰富特性,本书围绕着基础知识和这些新特性全面介绍了如何利用visual studio 2010和.net framework 4.0编写应用程序。书中沿袭深受读者欢迎的step by step风格,通过丰富的练习...

    C#与.NET3.5高级程序设计第四版.pdf

    C#是微软推出的一种面向对象开发语言,其能让已有经验的开发人员轻松上手,并在很短的时间内就可以使用C#高效地进行工作。这是读者选择C#的原因。目前最新的C#版本就是.NET 3.5框架上的C# 3.0。本书借助Visual ...

    ASP.NET+SQL Server高校教学设备管理系统.rar

    系统是基于B/S模式,通过C#开发语言和SQL Server数据库来实现的。是在Microsoft Visual Studio 2010平台中完成系统的开发。系统主要包括了管理员用户,登录后可以实现设备采购管理、设备领用管理、设备报修、设备...

    Visual Assist X 说明

    Visual Assist X是一款非常好的Microsoft Visual Studio 2005和Visual Studio .NET插件,支持C/C++,C#,ASP,Visual Basic,Java和HTML等语言,能自动识别各种关键字、系统函数、成员变量、自动给出输入提示、...

    ActiveReports3 Version 5.x

    由此给Visual Studio .NET的开发者在用ActiveReports for .NET开发应用程序时,可以调节掌握当前的程序语言技术(Visual C# 或 Visual Basic .NET)。 ActiveReports for .NET与Microsoft® Access report ...

    Visual Assist X_10.9.2406原版+补丁

    Visual Assist X是一款非常好的Microsoft Visual Studio 2005和Visual Studio .NET插件,支持C/C++,C#,ASP,Visual Basic,Java和HTML等语言,能自动识别各种关键字、系统函数、成员变量、自动给出输入提示、...

    LINQ TO ADO.NET

    这是在 .NET Framework 的早期版本中编写多数应用程序方式的重大更改。 使用编程语言中编写查询具有多项重要优势。 它可以简化查询,不必使用单独的查询语言。并且,如果您使用 Visual Studio 2008 IDE,LINQ 还...

    Visual Assist X 10.9.2052内置crack工具

    Visual Assist X是一款非常好的Microsoft Visual Studio 2005和Visual Studio .NET插件,支持C/C++,C#,ASP,Visual Basic,Java和HTML等语言,能自动识别各种关键字、系统函数、成员变量、自动给出输入提示、...

    Visual Assist X Visual studio助手

    Visual Assist X是一款非常好的Microsoft Visual Studio 2005和Visual Studio .NET插件,支持C/C++,C#,ASP,Visua l Basic,Java和HTML等语言,能自动识别各种关键字、系统函数、成员变量、自动给出输入提示、...

Global site tag (gtag.js) - Google Analytics