純粋に、そういえば、どういう構造で管理してるのかな?と思ってソースを見てみました。
そうすると、下のようになっており
TList<T> = class(TEnumerable<T>)privatetypearrayofT = array of T;
動的配列を使っていました。
なるほど!これならオブジェクトの解放を自分で管理しなくて済みますね!
Delphi の動的配列は解放をコンパイラに任せられるためです。
あって良かった動的配列!
とはいえ、当然のことですが、インスタンスの場合は解放が必要になります。
例えば、以下のコードの様にインスタンスを生成した場合、破棄が必要です。
program Project1;{$APPTYPE CONSOLE}usesSystem.Generics.Collections;type// TList で管理されるクラスTTest = classpublicconstructor Create(const iIndex: Integer); reintroduce;end;// TTest クラスを型データとするTObjectList = TList<TTest>;{ TTest }constructor TTest.Create(const iIndex: Integer);beginWriteln('TTest.Created !, Index = ', iIndex);end;procedure Test;varList: TObjectList;i: Integer;beginList := TObjectList.Create;try// インスタンスの生成for i := 0 to 9 doList.Add(TTest.Create(i));// インスタンスの解放for i := 0 to List.Count - 1 doList[i].Free;finallyList.Free;end;end;beginTest;Readln;end.
そう考えると TList 等のジェネリクス型と相性が良いのは record の様な気がします。
解放を考えなくて済みますから。
ただ、ここで注意したいのは以前書いた記事のように、record はあくまでも record であるという事です。
TList と組み合わせて使うと、この罠に引っかかりやすいので注意が必要です。
私もrecordの罠にはまったことがあります。結局面倒でもClassとTObjectListを使いました。
返信削除Genericsはまだ使う機会がなかったのですが、同様にTList<T>でなくTObjectList<T>を使うのが便利かもしれません。
この罠には引っかかりやすいですよね。
返信削除確かに TObjectList を使えば解放を任せられるので良いと思います。