三、體驗TObjectList四、TList和TObjectList的區別五、后記一、概述等了幾百年,Delphi終于原生的支持泛型了。以前使用Delphi,泛型是不被支持的,但是可以用一些第三方庫來實現間接的泛型容器支持。如HouSisong大蝦編制的DGL泛型庫,只需要創建幾個簡單的“頭”文件,就可以擁有指定類型的容器集合類。DGL泛型庫非常類似于STL泛型庫,很容易上手,如果大家想知道具體使" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Delphi2009初體驗 - 語言篇 - 體驗泛型(一)

系統 2145 0

快速導航:

一、 概述

二、 體驗TList<T>

三、 體驗TObjectList<T>

四、 TList<T>和TObjectList<T>的區別

五、 后記

一、概述

等了幾百年, Delphi 終于原生的支持泛型了。以前使用 Delphi ,泛型是不被支持的,但是可以用一些第三方庫來實現間接的泛型容器支持。如 HouSisong 大蝦編制的 DGL 泛型庫,只需要創建幾個簡單的“頭”文件,就可以擁有指定類型的容器集合類。 DGL 泛型庫非常類似于 STL 泛型庫,很容易上手,如果大家想知道具體使用方法,我另外開文章說明。

Delphi2009 提供了幾個好用的泛型容器,如 TList<T> TQueue<T> TStack<T> TDictionary<TKey, TValue> ,還有針對于對象使用的 TObjectList<T> 等幾個類。此外,還提供了 TArray 數組輔助靜態類,封裝了數組( array of T )的幾個常用操作,如排序等。

但是在智能感知的時候, TList<T> 等泛型集合提示好像有些 BUG

Delphi2009初體驗 - 語言篇 - 體驗泛型(一)

1

為什么是“ [] ”,而不是“ () ”?

下面針對TList和TObjectList及兩者的區別對Delphi2009的泛型功能進行初步體驗。

二、體驗TList<T>

在此,我將使用以前版本的指針集合類TList與TList<T>作對比,保存一組整形數據。使用控制臺的方式進行程序編寫。


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 program TestTList;
2
3 { $APPTYPECONSOLE }
4
5 uses
6 SysUtils,
7 Classes,
8 Generics.Collections; // 泛型集合命名空間,太優美了!
9
10 var
11 intList:TList < Integer > ;
12 oldList:TList;
13 n,elem:Integer;
14 pTmp:Pointer;
15 begin
16 // 以下代碼測試舊的集合對象
17 oldList: = TList.Create;
18 oldList.Add(Pointer( 1 ));
19 oldList.Add(Pointer( 2 ));
20 oldList.Add(Pointer( 3 ));
21
22 Writeln( ' TListstart ' );
23
24 for n: = 0 to oldList.Count - 1 do
25 begin
26 Writeln(Integer(oldList[n]));
27 end ;
28
29 for pTmp in oldList do
30 begin
31 Writeln(Integer(pTmp));
32 end ;
33
34 FreeAndNil(oldList);
35
36 // 以下代碼測試整形泛型集合對象
37 intList: = TList < Integer > .Create;
38 intList.Add( 1 );
39 intList.Add( 2 );
40 intList.Add( 3 );
41
42 Writeln(# 13 + # 10 + ' TList<T>start ' );
43
44 for n: = 0 to intList.Count - 1 do
45 begin
46 Writeln(intList[n]);
47 end ;
48
49 for elem in intList do
50 begin
51 Writeln(elem);
52 end ;
53
54 FreeAndNil(intList);
55
56 // ----------------------------------------------------------
57 Writeln( ' pressanykey ' );
58 Readln;
59 end .

運行結果:

Delphi2009初體驗 - 語言篇 - 體驗泛型(一)

圖2

三、體驗TObjectList<T>

剛開始看到TObjectList的時候我有點不解,既然是泛型,那么T就不區分值類型和引用類型,為什么還會多出來一個TObjectList< T>呢?在閱讀了Generic.Collections的源碼和經過試驗后,我終于明白了原因,待我來慢慢分析。

同樣,我將使用Contnrs命名空間下的TObjectList和TObjectList<T>做對比,使用控制臺程序進行程序的編寫。

首先創建一個類,該類在創建時,對象將打印“創建 ” + 對象的索引號,銷毀時打印“銷毀 ” + 對象的索引號:

1 unit Felix;
2
3 interface
4
5 uses
6 SysUtils;
7
8 type
9 TFelix = class
10 private
11 fId:Integer;
12 public
13 constructor Create; virtual ;
14 destructor Destroy; override ;
15 property Id:Integer read fId write fId;
16 end ;
17
18 var
19 gCount:Integer;
20
21 implementation
22
23 { TFelix }
24
25 constructor TFelix.Create;
26 begin
27 fId: = gCount;
28 Writeln( ' ConstructorFelix ' + IntToStr(fId));
29 Inc(gCount);
30 end ;
31
32 destructor TFelix.Destroy;
33 begin
34 Writeln( ' DestructorFelix ' + IntToStr(fId));
35
36 inherited ;
37 end ;
38
39 end .
40

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 unit Felix;
2
3 interface
4
5 uses
6 SysUtils;
7
8 type
9 TFelix = class
10 private
11 fId:Integer;
12 public
13 constructor Create; virtual ;
14 destructor Destroy; override ;
15 property Id:Integer read fId write fId;
16 end ;
17
18 var
19 gCount:Integer;
20
21 implementation
22
23 { TFelix }
24
25 constructor TFelix.Create;
26 begin
27 fId: = gCount;
28 Writeln( ' ConstructorFelix ' + IntToStr(fId));
29 Inc(gCount);
30 end ;
31
32 destructor TFelix.Destroy;
33 begin
34 Writeln( ' DestructorFelix ' + IntToStr(fId));
35
36 inherited ;
37 end ;
38
39 end .

控制臺程序代碼:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 program TestTObjectList;
2
3 { $APPTYPECONSOLE }
4
5 uses
6 SysUtils,
7 Contnrs,
8 Generics.Collections,
9 Felix in ' Felix.pas ' ;
10
11 var
12 objList:TObjectList < TFelix > ;
13 oldObjList:TObjectList;
14 n:Integer;
15 felix:TFelix;
16 pFelix:Pointer;
17 begin
18 // 以下代碼測試舊對象集合
19 Writeln( ' TObjectListstart ' );
20
21 oldObjList: = TObjectList.Create; // 1 *
22 for n: = 0 to 2 do
23 begin
24 oldObjList.Add(TFelix.Create);
25 end ;
26
27 for pFelix in oldObjList do
28 begin
29 Writeln(TFelix(pFelix).Id);
30 end ;
31
32 FreeAndNil(oldObjList);
33
34 // 以下代碼測試泛型對象集合
35 Writeln(# 13 + # 10 + ' TObjectList<T>start ' );
36
37 objList: = TObjectList < TFelix > .Create; // 2 *
38 for n: = 0 to 2 do
39 begin
40 objList.Add(TFelix.Create);
41 end ;
42
43 for felix in objList do
44 begin
45 Writeln(felix.Id);
46 end ;
47
48 FreeAndNil(objList);
49
50 // ----------------------------------------------------------
51 Writeln( ' pressanykey ' );
52 Readln;
53 end .

Delphi2009初體驗 - 語言篇 - 體驗泛型(一)

圖3

如果我們將代碼中的第1*處修改成:

oldObjList := TObjectList.Create(False);

將產生如下結果:


Delphi2009初體驗 - 語言篇 - 體驗泛型(一)

圖4

相對于TObjectList<T>,沒有Create(AOwnsObjects: Boolean)方式的重載,我們如何才能讓TObjectList<T>“不擁有”對象,當TObjectList<T>中的 元素重新賦值、TObjectList<T>集合對象銷毀的時候,怎樣能保證里面的舊元素不進行銷毀操作呢?答案是:不能。

四:TList<T>和TObjectList<T>的區別

如果將上面代碼的objList對象聲明時改成TList<TFelix>類型,并將第2*處代碼改成objList := TList<TFelix>.Create;結果就和使用TObjectList(圖4)的效果一樣了,當調用方法SetItem或者集合被 銷毀后,舊元素或者內部的元素不會被銷毀。

原因在于,TObjectList<T>從TList<T>繼承而來,只重寫了Notify方法,此方法在集合內元素改變(指針變換、刪除、添加)等操作時調用。

請閱讀Generics.Collections.pas文件第1236行,TObjectList<T>重寫了Notify方法后,先調用了超類的Notify方法,然后判斷操作如果為cnRemoved則將元素.Free,所以元素在此處被析構。

五:后記

使用TObjectList<T>會將對象自動銷毀,使用TList<T>不會將對象自動銷毀。
受Symbian編程的影響,我習慣于對象自己創建、對象自己銷毀,特別是在使用對象集合類,有時候一個對象可能在這個集合內,同時又在另外一個集合內。 如果TObjectList<T>把對象銷毀了,在另外一個集合內使用對象會造成不可預料的后果,所以建議大家不要使用 TObjectList<T>。

其他幾個泛型類TDictionary<>等,方法和代碼都和.net的類似,看了看代碼,真是讓人遐想連篇,此處不再介紹。

Delphi2009初體驗 - 語言篇 - 體驗泛型(一)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 男人女人真曰批的视频动态 | 午夜视频网 | 亚洲女人逼 | 午夜视频在线观看网站 | 色婷婷视频在线 | 欧美日韩一区二区三区自拍 | 中国一级毛片在线观看 | 国产视频久久久 | 2020久久精品永久免费 | 久久久免费视频播放 | 视频一区二区在线 | 久久精品国产99国产精品亚洲 | 国产免费久久精品99久久 | 久久伊伊香蕉综合精品 | 377p欧洲最大胆艺术 | 国产精品久久久久久久免费大片 | 擼擼色在线看观看免费 | 久久精品成人国产午夜 | 久久久久久免费视频 | 二级毛片在线观看 | 欧美交换乱理伦片在线观看 | 波多野吉衣一区二区三区四区 | 精品免费视在线观看 | 亚洲va欧美va国产va天堂 | 操日本妞| 久久综合久色欧美婷婷 | 亚洲另类伦春色综合妖色成人网 | 色黄网站成年女人色毛片 | 四虎影音先锋 | 国产成人a在一区线观看高清 | 99999久久久久久亚洲 | 亚洲综合免费视频 | 久久91精品久久91综合 | 国内揄拍国内精品久久 | 深夜色| 99re这里只有精品国产精品 | 婷婷综合色伊人阁 | 欧美韩日在线 | 久久久中文字幕日本 | 99香蕉国产 | 91亚洲精品一区二区自 |