Wie Danny Thorpe in seinem Blogbeitrag
New For Loop Syntax beschreibt, John Kaster im
BDNtv: Diamondback sneak peek zeigt und hier ua bereits im Thema
for-each Schleife in Delphi diskutiert worden ist, soll Diamondback nun Schleifenkonstrukte der Art
for <variable> in <container expression> do <statement>;
in Szenarien wie
Delphi-Quellcode:
type
TMultiArray = array [0..10, 0..3, 0..9] of Integer;
procedure DemoMulti(const table: TMultiArray);
var
X: Integer;
begin
for X in table do
Writeln(x);
end;
aber auch
Delphi-Quellcode:
procedure DemoTStrings(const AStrings: TStrings);
var
S: string;
begin
for S in AStrings do
Writeln(S);
end;
unterstützen.
Während Danny bei Ordinaltypen und Arrays von speziell vom Compiler verarbeiteten, also CompilerMagic, spricht, schweigt sich John über die Realisierung von Klassen (hier:
TStrings), die das neue For-Konstrukt unterstützen sollen, aus. Danny schreibt zwar, dass der Containerausdruck
Zitat von
danny:
either implements the IEnumerable interface, or implements a pattern that the compiler recognizes as an enumerator, or is a type that the compiler recognizes as being a container of data items, such as an array
und spricht im letzten Fall offensichtlich von Fällen jener Übersetzungsmagie während der erste dem Ansatz in etwa der
in Java-Tiger eingeführten Lösung zu entsprechend scheint- unklar hingegen bleibt mir die Aussage, dass
Zitat von
Übersetzung der Aussage von Danny:
eine Klasse implementiert ein Muster, das der Compiler als Enumerator erkennt
Wird hier auf die Meta-Ebene gegangen und die Signatur von Methoden auf die Teilbegriffe "Count", "Item" oder sonstigen für Delphi typischen Bezeichnungen für Problemlösungen dieser Art geprüft? Hätte John in seinem Preview nicht explizit gezeigt, dass die Verarbeitung mit
TStrings auch unter
Win32 funktioniert und erwähnt, dass die
VCL generell angepasst wird, um die neue For-Schleife zu unterstützen, hätte ich mich nicht weiter gewundert, nun jedoch stellt sich für mich folgendes Problem:
Mir ist unklar, wie eine Delphi-
Win32-Klasse unter Verwendung der besherigen Referenzzählung ein bestimmtes Interface implementieren sollte und ein Objekt dieser Klasse in der oben beschriebenen Form aufgerufen werden kann, ohne dass ein Verringern des Referenzzählers nach Gebrauch auf null zu dessen Freigabe führt!
Beispiel:
Delphi-Quellcode:
var
MyStrings: TStrings;
S: string;
begin
MyStrings := TStringList.Create;
try
//...
for s in MyStrings do // use IEnumerable -> _AddRef
Writeln(s);
finally // leave scope of IEnumerable -> _Release -> .Destroy
FreeAndNil(MyStrings); // tries to destroy object again!
end;
Weiß jemand von Euch hierzu etwas genaueres und ist die Schnittstelle von
IEnumerable bekannt?
Update: Titel des Themas