Delphi.net对Pascal语言的一些改进

                            
下面是对   
  http://expert.csdn.net/Expert/topic/2041/2041804.xml?temp=.1945764  
  的补充,我已将完整的资料整理成压缩包,放在http://61.129.75.211/images/delphi.rar上面,欢迎大家下载  
   
  Assemblies   and   Delphi  
   
  我相信大家通过上面的代码,应该对DELPHI   for   .NET有了一个大概的了解,从上面的代码中可以看到DELPHI语言的一小部分改进,但它的变化不止这些。  
   
  单元命名空单  
  通过研究上面的代码,可以看到一个明显的改变就是支持命名空间的单元,合名空间允许你通过完整的标识符来访问单元,例如:  
  uses   Borland.Delphi.SysUtils;  
  DELPHI单元用带有点名称来表示单元标识符和文件名(单元名与文件名称仍然必须一致,单元名可以忽略“.pas”)。  
  项目命名空间  
  你可以使用项目命名空间,项目命名空间是一个代替编译语句IFDEF的好的方法。  
   
  项目命名空间的搜索路径  
  这里同样支持项目合名空间搜索路径,在单元引用时通过搜索路径可以找到单元命名空间的绝对路径,参考下面例子:  
  Uses   Forms;  
  这在一个VCL项目中则表示Borland.VCL.Forms,而在一个CLX项目中则表示Borland.CLX.Forms,这取决于项目的开发平台(比如.NET,Win32,Linux)。  
   
  默认的项目命名空间  
  你也可以建立一个可以编译到多个项目命名空间的单元,例如:  
  Unit   MyControl;  
  在一个VCL项目中将会编译为Borland.VCL.MyControl.dcuil,而在CLX项目中将会编译为Borland.CLX.MyControl.dcuil。  
   
  有效标识符  
  在标识符后可以使用保留字和关键字,便如下面代码:  
  var  
      Label1:   System.Label;  
  在类型表达式中可以使用保留字和关键字,但在标识符定义中不能使用。类型表达式System.Label是有效的虽然它包含保留字Label,未来的编译器计划要扩展标识符语法使其可以使用Unicode/UTF8编码的字符。  
  在Common   Language   Specification(通用语言说明书)包含这些扩展标识符的语法,DCCIL编译器将会支持这些扩展标识符语法。  
   
  嵌套类型  
  参考下面代码:  
  type  
  TMyClass   =   class  
      Fdata:   Integer;  
      const   foo   =   12;  
      type   TNestedClass   =   class  
          procedure   Hello;  
      end;  
      procedure   Green;  
  end;  
  ...  
  var  
      MyClass   :   TMyClass;  
      MyNest:   TMyClass.TNestedClass;  
  ...  
  begin  
      MyClass.Fdata   :=   15;  
      MyNest   :=   TMyClass.TNestedClass.Create;  
      MyNest.Hello;  
      MyClass.Green;  
  end;  
  类型TNestedClass是嵌套在类型TMyClass中的,但是不影响TMyClass类型的实例,因为TMyClass.TNestedClass中定义的数据域不会占用TMyClass实例的空间,嵌套类型是命名空间思想的一个扩展,合呼命名习惯。  
  在上面的代码中,MyNest实例没有被释放掉是因为将被.NET   RUNTIME释放。  
   
  自定义属性  
  DELPHI.NET中将支持基本的属性,例如:Conditional,   Obsolete,   Serializable,   和webMethod,你也可以创建自己的属性,就像下面代码:  
  type  
      [   FooAttribute('Hello',   23)   ]  
      TMyClass   =   class  
          [   SpecialDataAttribute   ]  
          Fdata:   Integer;  
          [   WebMethod,   DebuggerStepThrough   ]  
          function   SampleCount:   Byte;  
      end;  
   
  声明自定义属性  
  DELPHI.NET允许你在.NET   Application中建立自定义的属性,便如下面TQuantumAttribute的声明代码:  
  type  
      TQuantumAttribute   =   class(TCustomAttribute)  
          constructor   Create;  
          constructor   Create(Name:   String);  
          property   Name:   String   ...;  
          property   Spin:   Double   ...;  
          property   Color:   TQuarkColor   ...;  
      end;  
   
  类的静态数据域  
  在你的定义的类中可以拥有类数据域,利用这些静态的数据域,你可以做一些事情,例如可以存储类的实例的数量、类的一些信息等。  
  type  
  TMyClass   =   class  
      class   Fdata:   Integer;  
      class   property   Foo:   String   ...;  
      class   procedure   One;  
      class   static   procedure   Two;  
  end;  
   
  类的静态属性  
  和类的静太数据域相似,它的读取和写入必须通过静态方法。  
  类的静态方法  
  类的静态方法中除了不能使用“Self”之外,其他类似于传统的类方法。但是在传统的DELPHI程序中类方法中依然可以使用“Self”。  
   
  值类型  
  类型可以被包装成为一个对象形式,值类型不是一个参考类型,它们是类型的实例。在DELPHI中记录类型便是值类型的一个例子,记录可以继承自其他记录,可以包含非虚方法、属性和嵌套类型。  
  当一个值类型被封装后,将产生一个新的值并且返回一个对象参考,该对象参考完全独立于原来的值类型,下面代码:  
  TObject(12).ToString  
  代码TObject(12)将一个整型数封装进一个对象。  
  对.net来说,delphi中值类型的封装是必须的,这种封装没有计划在Win32或Liunx版的Delphi中实现。  
   
  记录的继承  
  在CLR中DELPHI将实现记录的值类型,记录的继承是值类型的一个方面,可以包含非虚方法是值类型的另一个方面。  
   
  记录的方法  
  在Trecord类型中将允许声明方法。  
   
  Sealed   classes(这种类型不知道应该怎么用中文称呼,所以没有翻译)  
    Sealed   classes不能被继承,值类型只能继承自一个抽像的值类型,并且一个Sealed值类型可以被实例化。  
   
  Final   Method(同上面一样,还是英文称呼好一些)  
  在虚方法或是使用override的方法中,Final说明这个方法在类的派生类别中是不能被重载的,派生类中依然可以声明同名的方法来继承该方法。  
   
  其它可能的改变  
   
  Multicast   events  
  利用这种机制,你可以对每一个事件拥有多个监听器,这种事件模式不同于WIN32的事件模式,在WIN32的事件模式下,只要有事件第一次被响应,这个事件就会作废,而在这种新的事件模式下,多个组件可以响应同一个事件。  
  在这种事件监听模式下,你只可以删除自己的事件监听器,通过重载Include()   and   Exclude()这两个基本的方法来添加或删除你自己的事件监听器。在传统的模式下是通过赋值:=来指定事件处理过程。  
  Multicast   events在Delphi.NET中被支持,也有可能在未来的DELPHI   for   Win32   or   Linux中被支持。  
   
   
   
   
  Interface   Method  
  旧版本中在类中对接口方法的声明:  
  Type  
      TMyClass   =   class(TBaseClass,   IFoo)  
          procedure   FooBar(paramlist);  
          procedure   IFoo.Bar   =   FooBar;  
      end;  
  新版本中在类中对接口方法的声明:  
   
  Type  
      TMyClass   =   class(TBaseClass,   IFoo)  
          procedure   IFoo.Bar(paramlist);  
      end;  
  这时候TMyClass.IFoo.Bar当然也是正确的引用。  
  当使用多个接口时,这种新的声明方式便显示非常重要了,看下面的例子:  
  IFoo1   =   interface  
      procedure   Bar;  
  end;  
   
  IFoo2   =   interface  
      procedure   Bar;  
  end;  
   
  TSomeClass   =   class(TBaseClass,   IFoo1,   IFoo2)  
      procedure   IFoo1.Bar;  
      procedure   IFoo2.Bar;  
  end;  
   
   
  另外,BORLAND在delphi   for   .net   preview中提供了delphi脚本的解释器,所以现在我们可以用DELPHI语言来写ASP.net了,我正在整理这方面的资料

查看回复