Obwohl ich persönlich kein Freund des Fluent-Interfaces bin, würde ich schon meinen, dass der Code so korrekt ist. Schaut man sich aber den erzeugten Assembler-Code an, wird schnell klar warum das nicht so ist. Da werden erst alle Parameter auf den Stack gelegt und dann die einzelnen Aufrufe ausgeführt. Weil der Rückgabewert ja eh schon auf dem Stack liegt, ist das eigentlich gar nicht so dumm gelöst. Faktisch wird die Fluent-Aufruf-Kette aber dann so behandelt wie ein einzelner Aufruf mit zwei Parametern - wie in dem Link beschrieben mit den entsprechenden Nebeneffekten.
Code:
Project765.dpr.44: lTest.SetTo2(lCount).SetI(lCount + 1).WriteInt;
0041D30F 8B45F8 mov eax,[ebp-$08]
0041D312 8B55FC mov edx,[ebp-$04]
0041D315 83C001 add eax,$01
0041D318 83D200 adc edx,$00
0041D31B 52 push edx
0041D31C 50 push eax
0041D31D 8D55F8 lea edx,[ebp-$08]
0041D320 8B45F4 mov eax,[ebp-$0c]
0041D323 E800FFFFFF call TTest.SetTo2
0041D328 E827FFFFFF call TTest.SetI
0041D32D E84AFFFFFF call TTest.WriteInt
0041D332 33C0 xor eax,eax
0041D334 5A pop edx
0041D335 59 pop ecx
0041D336 59 pop ecx
0041D337 648910 mov fs:[eax],edx
0041D33A 684FD34100 push $0041d34f
Project765.dpr.46: lTest.Free;