这是D7中的TList的一些声明
FList: PPointerList;
property List: PPointerList read FList;
function Add(Item: Pointer): Integer;
function First: Pointer;
function Last: Pointer;
这是D8中的TList的一些声明
FList: System.Collections.ArrayList;
property List: System.Collections.ArrayList read FList;
function Add(Item: TObject): Integer;
function First: TObject;
function Last: TObject;
这是在D7是PpointerList的声明:
PPointerList = ^TPointerList;
TPointerList = array[0..MaxListSize - 1] of Pointer;
看一下D7的TList,TList内部维护的Flist是一个PpointerList,实际上就是一个指向TpointerList的指针,(如最上面的程序,myList.Add(myLab)实际上就是往Flist中增加元素)TpointerList是一个静态的元素为无类型指针的数组。Pointer类型为无类型指针,这个在D7中的Pointer在D8的.net mangaged环境已经不能使用了,如果你在Vcl.net工程中声明一个Pointer变量,按f9会被告知: UnSafe pointer variables,parameters or consts only allowed in unsafe procedure 。所以上面D8的TList源码声明中的所有Pointer已经变成了Tobject,(注意这个TObject其实已经不是原先D7那个TObject了,它是:System.Object,这个等会再说。)。引用的一篇文章的一句话:Pointer -- There is a Pointer type, but in safe code Pointer is a reference to an object. You can''''t do pointer math on it.(http://delphi.weblogs.com),在.net的managed环境中指针代表对象的引用。即然原先的Pointer已经不能用了,那么Flist:PpointerList也就不能成立,于是它在D8中被改成了FList: System.Collections.ArrayList,所有Pointer都成了Tobejct。那么ArrayList,请去看看.Net的MSDN,功能上完全可以充当一个指针数组,只不过它的元素由Pointer变成了Tobject类型。
其实看完了想想上面这个问题也很简单,就是一个寻找替代品的问题,看看D8的TList各方法的源码基本都没有变。后来我又看了一个其它类的源码发现在VCL.net中有好多这种’替代情况’,当原先的Delphi语言元素在.net环境中不便于或不能使用时,总会有一个.net framework中的替代品。
TObject:
打开D8中的 Borland.Delphi.System.pas只看一下上面几行
type
TObject = System.Object;
TCustomAttribute = System.Attribute;
Exception = System.Exception;
TGUID = System.Guid;
这与D7的TObject,Exception类的定义已经大不相同了,在D8中TObject就是.net的System.Object,另外那个Exception也一样。“.NET Framework 中的所有类均从 Object 派生,所以 Object 类中定义的每个方法可用于系统中的所有对象。派生类可以而且确实重写这些方法中的某些,其中包括:”-------来自MSDN,那么就很自然了,原先VCL的TObject的地位和作用与上面MSDN里对System.Object类描述一样,那VCL要移植到.net就必须照办,即TObject定义为System.Object,而对于子类来说,声明还是subclass=class(TObject) ,但实际上已经是System.Object了,底层处理完全由.net framework来进行。而且没有System.Object的源码我们也不知道它干了什么。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




